我正在尝试在我的目录中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这个表达?
答案 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]
此处只有开头[
被转义,导致任何单独]
的出现被视为普通字符而没有特殊含义