如何与grep
正则表达式 RH[A-ZA-Z] 匹配,使字符串包含 RH 以及两个字符,这两个字符都是 A 和 Z 之间的字母?
我尝试过这个但没有成功:
yum list-security --security | awk '{print $1}' | sort | uniq | grep RH[A-ZA-Z]
Loaded
RHEA-2014:1307
RHSA-2014:1326
RHBA-2014:1388
RH@A-2014:1389
RHSA-2014:1392
RHSA-2014:1389
RH7A-2014:1392
RHSAA-2014:1389
RHMAW-2014:1392
这就是我所期望的:
RHEA-2014:1307
RHSA-2014:1326
RHBA-2014:1388
RHSA-2014:1392
RHSA-2014:1389
答案1
RH[A-ZA-Z]
是包含单个字符类的正则表达式,该字符类重复同一组字符两次。它匹配RH
后跟从A
到 的任何字符Z
。它对第四个字符没有限制,甚至不需要有第四个字符。
显然,这并不能达到你想要的效果。
试试这个:RH[A-Z][A-Z]
或者(使用扩展grep -E
或perlgrep -P
正则表达式)RH[A-Z]{2}
另外,最好在正则表达式周围放置单引号(或者双引号,如果您需要包含变量或命令替换),以确保 shell 不会尝试将它们扩展为全局变量 - 例如,如果您有当前目录中的文件名RHAA
,shell 会将您的参数扩展为 RHAA,这就是全部你grep
会看到:
$ grep RH[A-Z][A-Z] yael.txt | wc -l
7
$ touch RHAA
$ grep RH[A-Z][A-Z] yael.txt | wc -l
0
相当于:
$ grep RHAA yael.txt | wc -l
0
但情况变得更糟。如果您还有一个名为“RHAB”的文件,则grep
命令行将扩展为:
grep RHAA RHAB yael.txt
因此将在文件以及标准输入和/或要搜索的命名文件中grep
搜索正则表达式。RHAA
RHAB
使用带引号的 grep 代替:grep 'RH[A-Z][A-Z]'
更新:
如果您只想RH
后跟两个[A-Z]
字符(但不超过两个),请改用:
grep 'RH[A-Z][A-Z][^A-Z]' yael.txt
第三个字符类[^A-Z]
以 开头^
,它否定或反转该类。换句话说,它匹配任何字符除了 A
到Z
。
无论您使用哪个版本的正则表达式,您可能都希望将匹配锚定到行的开头。您^
也可以使用它,但它在 之外具有完全不同的含义[]
。这是行首锚点。例如,这个:
grep '^RH[A-Z][A-Z][^A-Z]' yael.txt
只会匹配行开始与RH[A-Z][A-Z][^A-Z]
, 并将不是将线条与其他任何地方的该模式相匹配。