grep 正则表达式模式导致意外的命令行为

grep 正则表达式模式导致意外的命令行为

我正在终端中通过以下 grep连续$搜索带有和的行:'"

grep "\\$('|\")" -rin folder_path

按下 Enter 键后,终端认为该行不完整,因此它会添加另一行让我继续写入。如果我Tab在写入时按下folder_path,它会显示此错误:

bash: command substitution: line 107: syntax error: file premature end
bash: command substitution: line 106: unexpected file premature end while searching for `''

这些错误消息已被翻译,因为其中一部分以葡萄牙语显示。我正在使用 Ubuntu 13.10。

怎么了?

答案1

用这个:

grep -rn "\$\('\|\"\)" /path/to/directory

你的问题实际上是双重的:

  • grep的角度来看,您正在使用扩展正则表达式语法,即 、(|)没有在基本正则表达式模式中对其进行转义(以将其视为特殊)。要克服这个问题,请转义所有这些语法以将其视为特殊语法,或使用-E选项grep

  • 上述未转义问题导致的另一个问题是$()命令bash替换模式,因为您没有转义相关字符,bash因此将模式$()视为命令替换。请注意,\\$()实际上将命令\加上命令替换作为第一个\将生成第二个\文字,而其余的命令替换模式将保持原样。

还请注意,-i这里不需要,因为我们不搜索字母字符。您可能对打印文件名感兴趣:

grep -Hrn "\$\('\|\"\)" /path/to/directory

另一件事是,在这种情况下你可以不转义$(表示行尾)而逃脱,因为在之后有字符需要匹配$,因此grep将按字面意思处理它:

grep -Hrn "$\('\|\"\)" /path/to/directory

答案2

不知道你做错了什么,因为我不太擅长使用 grep,但你应该这样做 grep "\$'\|\$\"",基本上搜索 $' 或 $", 并注意这些表达式都是转义的

以下是一个例子:

在此处输入图片描述

相关内容