我怎样才能用括号和引号来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]" .
$
仍然需要转义,因为整个字符串都在双引号中。
我正在尝试在我的目录中搜索以下内容:
$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]" .
$
仍然需要转义,因为整个字符串都在双引号中。