如何用括号和引号grep一个字符串?

时间:2015-05-12 17:50:18

标签: regex grep

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

$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这个表达?

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

关于转义

基本上你只需要转义在basix posix regex中有意义的字符,它们是:

  • $行尾
  • [角色类的开始
  • ]字符类结束

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

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

关于固定字符串而非模式

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

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

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

答案 2 :(得分:0)

您需要引用$ []

<强>测试

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

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

为什么?

  • $在bash / shell中逃避$的特殊含义并防止变量扩展

  • []逃避字符类[的特殊含义

更短的方法

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

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