当grep的参数时,在bash命令行上引用+

时间:2014-07-14 16:31:10

标签: bash shell grep escaping

有人可以澄清这里发生的事情。

我有一个这样的文本文件:

$ 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上感兴趣的相同行为。

2 个答案:

答案 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使用-PE参数,那么您不需要转义+(在此\+表示文字+)

单引号的

grep不支持变量扩展,但双引号的grep支持变量扩展。

示例:

$ f=v; grep '$f' file
$ f=v; grep "$f" file
v