将 RH[A-ZA-Z] 与 grep 匹配

将 RH[A-ZA-Z] 与 grep 匹配

如何与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搜索正则表达式。RHAARHAB

使用带引号的 grep 代替:grep 'RH[A-Z][A-Z]'


更新:

如果您只想RH后跟两个[A-Z]字符(但不超过两个),请改用:

grep 'RH[A-Z][A-Z][^A-Z]' yael.txt

第三个字符类[^A-Z]以 开头^,它否定或反转该类。换句话说,它匹配任何字符除了 AZ


无论您使用哪个版本的正则表达式,您可能都希望将匹配锚定到行的开头。您^也可以使用它,但它在 之外具有完全不同的含义[]。这是行首锚点。例如,这个:

grep '^RH[A-Z][A-Z][^A-Z]' yael.txt

只会匹配行开始RH[A-Z][A-Z][^A-Z], 并将不是将线条与其他任何地方的该模式相匹配。

相关内容