【问题标题】:quote + on bash command line when argument for grep当 grep 的参数时,在 bash 命令行上引用 +
【发布时间】:2026-01-06 22:05:02
【问题描述】:

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

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

$ 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 -E(或egrep),以便grep使用扩展正则表达式。这样您就不需要引用大多数特殊字符。
  • @ooga 感谢 -E / egrep 提示
  • 值得注意——man grep 声称不推荐直接调用egrep(尽管仍然提供),并且还提供“匹配器选择”标志(例如-E 切换)和各种其他值得阅读/浏览的信息。

标签: bash shell grep escaping


【解决方案1】:

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

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

关于 BRE(基本正则表达式)与 ERE(扩展正则表达式)的一些附加信息可以在here 找到(以及其他地方),其中有关键要点因为 BRE 使用反斜杠“为元字符赋予风味”,而 ERE 使用反斜杠“抑制元字符的含义”。

【讨论】:

  • 所以基本上转义赋予了以下符号特殊含义?
  • 是的,虽然我会说转义标志符号 grep 将其解释为操作指令而不是字符文字。
  • 普通 grep 使用 BRE 解析输入文件。这就是为什么 grep 命令中的 + 需要转义以匹配前面字符的一次或多次的原因。
  • @AvinashRaj -- 谢谢,这是有用的信息。我承认我必须使用 Google BRE(没有意识到您的答案包含与该首字母缩略词相对应的三词短语),因此我更新了答案以拼出有关区别的一些信息。
【解决方案2】:

普通 grep 使用基本的正则表达式来解析输入文件。在 BRE 中,您需要转义 +,以便它按预期工作(即;一个或多个)。如果你在 grep 中使用-PE 参数,那么你不需要转义+(这里\+ 表示文字+)

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

示例:

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

【讨论】: