![grep 正则表达式模式导致意外的命令行为](https://linux22.com/image/1126619/grep%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%A8%A1%E5%BC%8F%E5%AF%BC%E8%87%B4%E6%84%8F%E5%A4%96%E7%9A%84%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%BA.png)
我正在终端中通过以下 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 "\$'\|\$\""
,基本上搜索 $' 或 $", 并注意这些表达式都是转义的
以下是一个例子: