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
后跟从A
to的任何字符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)
sogrep
将RHAA
在文件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]
以 开头^
,它否定或反转类。换句话说,它匹配除 A
to之外的任何字符Z
。
并且您可能希望将匹配锚定到行首,无论您使用哪个版本的正则表达式。你也用^
它,但它在[]
. 这是行首锚点。例如,这个:
grep '^RH[A-Z][A-Z][^A-Z]' yael.txt
Run Code Online (Sandbox Code Playgroud)
将只匹配行开始用RH[A-Z][A-Z][^A-Z]
,并且将不匹配这个模式其他地方线。