Bash 报价+;当grep的参数为

Bash 报价+;当grep的参数为,bash,shell,grep,escaping,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将非常

有人能澄清一下这里发生了什么吗

我有这样一个文本文件:

$ 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有问题吗


出于兴趣,我在Windows上使用
cmd.exe

获得了相同的行为。正常的grep使用一个基本的正则表达式来解析输入文件。在BRE中,您需要转义
+
,以便它能够按预期工作(即一个或多个)。如果将
-P
E
参数与grep一起使用,则无需转义
+
(在此
\+
中,表示文字+)

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

示例:

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

当您使用
+
而不转义它时,grep会在集合
[aei]
中的单个字符后查找字符
+
,该字符不会出现在示例文本文件中。当您转义
\+
时,您将“一个或多个事件”标志传递给grep

类似的行为也适用于其他特殊的grep符号,例如
grep“dad\| dead”text3.txt“
到grep表示“dad”或“dead”


关于BRE(基本正则表达式)与ERE(扩展正则表达式)的一些附加信息可以找到(除其他地方外),关键是BRE使用反斜杠“赋予元字符味道”,而ERE使用反斜杠”抑制元字符的含义“

您应该始终使用
grep-E
(或
egrep
),以便
grep
使用扩展正则表达式。这样您就不需要引用大多数特殊字符了。@ooga感谢-E/egrep tipWorth注意--
man grep
声称直接调用
egrep
已被弃用(尽管仍然提供),并且还提供了“匹配器选择”标志(如
-E
切换)还有其他各种值得阅读/浏览的信息。因此,转义基本上赋予了以下符号特殊的含义?是的,尽管我认为转义会将符号标记为grep,以将其解释为操作指令,而不是字符文字。普通grep使用
BRE
解析输入文件。这就是为什么grep命令中的
+
需要被调用以匹配前面字符的一次或多次的原因。@AvinashRaj--谢谢,这是有用的信息。我承认我不得不在谷歌上搜索BRE(没有意识到你的答案包含了一个与首字母缩略词对应的三个单词的短语),所以我更新了我的答案,详细说明了一些关于区别的信息。