有人可以澄清这里发生的事情。
我有一个这样的文本文件:
$ more text3.txt
daaaaaad
dead
dad
dd
did
deed
drd
duuuurd
如果在命令行上发出此命令:
$ grep "^d[aei]\+d$" text3.txt
daaaaaad
dead
dad
did
deed
我得到了我期望的结果。如果我在第一个grep参数周围使用单引号,则相同。
如果我在\
之前删除了+
,那么我从grep中得不到任何结果。
让我感到困惑的是,[aei]
grep在使用+
后会很好,并将其解释为前一个字符类中的一个或多个。那么为什么我需要逃避+
角色呢?是因为bash有问题吗?
我使用cmd.exe
在Windows上感兴趣的相同行为。
答案 0 :(得分:1)
当您使用+
而不转义它时,grep会在集合+
中的单个字符后查找字符[aei]
,这在您的示例文本文件中不会出现。当你逃离\+
时,你将“一个或多个出现”标志传达给grep。
类似的行为适用于其他特殊的grep符号,例如grep "dad\|dead" text3.txt"
grep for“dad”或“dead”。
有关 BRE (基本正则表达式)与 ERE (扩展正则表达式)的一些其他信息(在其他地方)here可找到关键点是BRE使用反斜杠“给元字符带来味道”,而ERE使用反斜杠“来抑制元字符的含义”。
答案 1 :(得分:0)
普通grep使用基本正则表达式来解析输入文件。在BRE中,您需要转义+
,以便它可以按预期工作(即;一个或多个)。如果您对grep使用-P
或E
参数,那么您不需要转义+
(在此\+
表示文字+)
grep
不支持变量扩展,但双引号的grep支持变量扩展。
示例:强>
$ f=v; grep '$f' file
$ f=v; grep "$f" file
v