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

yae*_*ael 3 grep regular-expression

如何与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
Run Code Online (Sandbox Code Playgroud)

这是我的预期:

 RHEA-2014:1307
 RHSA-2014:1326
 RHBA-2014:1388
 RHSA-2014:1392
 RHSA-2014:1389
Run Code Online (Sandbox Code Playgroud)

cas*_*cas 10

RH[A-ZA-Z]是一个正则表达式,它包含一个字符类,该类将同一组字符重复两次。它匹配RH后跟从Ato的任何字符Z。它对第四个字符没有限制,甚至不需要有第四个字符。

显然,这不会做你想要的。

试试这个:RH[A-Z][A-Z]或(使用扩展grep -E或 perl 正则grep -P表达式)RH[A-Z]{2}

此外,在正则表达式周围放置单引号(或双引号,如果您需要包含变量或命令替换)是个好主意,以确保 shell 不会尝试将它们扩展为 globs - 例如,如果您有一个文件名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
Run Code Online (Sandbox Code Playgroud)

相当于:

$ grep RHAA yael.txt  | wc -l
0
Run Code Online (Sandbox Code Playgroud)

但情况变得更糟。如果您还有一个名为“RHAB”的文件,grep命令行将扩展为:

grep RHAA RHAB yael.txt
Run Code Online (Sandbox Code Playgroud)

sogrepRHAA在文件RHAB以及标准输入和/或您要搜索的命名文件中搜索正则表达式。

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


更新:

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

grep 'RH[A-Z][A-Z][^A-Z]' yael.txt
Run Code Online (Sandbox Code Playgroud)

第三个字符类[^A-Z]以 开头^,它否定或反转类。换句话说,它匹配 Ato之外的任何字符Z


并且您可能希望将匹配锚定到行首,无论您使用哪个版本的正则表达式。你也用^它,但它在[]. 这是行首锚点。例如,这个:

grep '^RH[A-Z][A-Z][^A-Z]' yael.txt
Run Code Online (Sandbox Code Playgroud)

将只匹配行开始RH[A-Z][A-Z][^A-Z],并且将匹配这个模式其他地方线。