我怎样才能用括号和引号来grep一个字符串?

How can I grep a string with brackets and quotes?

我正在尝试在我的目录中搜索以下内容:

$form['#submit'][1]

我尝试了各种可能的转义字符排列,包括:

grep -r "$form\['#submit'\]\[1\]" ./*
grep -r "$form\['#submit']\[1]" ./*
grep -r "$form\['#submit']\[1]" *
grep -r "$form\['#submit'][1]" *
grep -r "$form\[\'#submit'][1]" *
grep -r "$form\[\'#submit']\[1]" *
grep -r "$form\[\'#submit\']\[1]" *
grep -r "$form\[\'#submit\'\]\[1\]" *
grep -r "$form\[\'#submit\'\]\[1\]" *
grep -r "$form\[\'#submit\'\]\[1\]" *
grep -r "$form['#submit'][1]" ./*

但似乎没有任何条款是正确的。我如何 grep 这个表达式?

您需要引用 $ []

测试

$ cat input
$form['#submit'][1]

$ grep "$form\['#submit'\]\[1\]" input
$form['#submit'][1]

为什么?

  • $ 转义bash/shell中$的特殊含义,防止变量膨胀

  • []转义字符class

  • [的特殊含义

更短的方法

$ grep "$form\['#submit']\[1]" input
$form['#submit'][1]

这里只有开头的 [ 被转义,这会导致任何单独出现的 ] 都被视为没有特殊含义的普通字符

关于转义

基本上你只需要转义在 basix posix 正则表达式中有意义的字符,它们是:

  • $行尾
  • [ 字符开始 class
  • ] 字符结束 class

此外,您需要使用双引号将模式括起来,因为它本身包含单引号。但是在这种情况下,您需要对 $ 进行双重转义,因为它在 shell 的双引号(变量的开头) 正则表达式模式中具有意义(行尾)。

grep -r "\$form\['#submit'\]\[1\]"

关于固定字符串而不是模式

另一方面,您需要知道 grep 还能够搜索固定字符串而不是正则表达式模式。在这种情况下,您需要传递 -F

grep -rF "$form['#submit'][1]"

现在,只有 $ 需要转义,否则 bash 会尝试将后续字符扩展为变量名。

我建议避免过度转义使用 -F 固定字符串搜索选项:

grep -riF "$form['#submit'][1]" .

$ 仍然需要转义,因为整个字符串都在双引号中。