我期望的结果如下:递归搜索目录,在所有找到的文件中查找给定的字符串。以下命令是我常用的调用端口:
find ./ | xargs grep -ns 'foobar'
但是,当使用引号时,该命令会失败并在 shell 中foobar
给出提示。>
导致该问题的具体命令如下:
find ./ | xargs grep -ns 'add_action(\'save_post\','
我尝试用反斜杠转义引号,但无济于事。这样做的正确方法是什么?
答案1
单引号以单引号结束;其间的所有其他字符均按原样保留,包括反斜杠。因此,无法在单引号之间嵌入单引号。 (但是你能结束单引号、转义单引号并开始一组新的单引号,如'Single quotes aren'\''t ever really embedded in single quotes.'
)
建议:grep -r pattern .
当可以在当前目录上递归地 grep时,请避免使用 find+xargs 。
以下命令具有等效的行为:
grep -rns "add_action('save_post'," .
grep -rns 'add_action('\'save_post\', .
最后一条命令解释为:
'add_action('
->add_action(
\'
->'
save_post
->save_post
\'
->'
,
->,
连接这些部分,该grep
命令接收参数add_action('save_post',
。
答案2
xargs
期望以某种奇怪的方式引用参数,但find
不会产生。切勿xargs
与 结合使用find
,除非您知道文件名不包含\"'
空格。
我们不使用xargs
,而是find
直接调用您要运行的程序。
find . -exec grep -ns 'add_action('\''save_post'\'',' {} +
使用 时exec … {} +
,该程序会同时针对多个文件调用一次,就像使用xargs
.某些旧版本find
不支持+
此处,那么您必须使用;
它,grep
每个文件调用一次。
find … -print0 | xargs -0
如果您的实用程序支持,您也可以使用。该-print0
选项告诉find
发出由空字节分隔的名称,并-0
告诉xargs
期待空分隔的输入并且不进行任何引号解释。
请注意上面的引用:在单引号之间,所有字符均按字面解释,但'
表示文字字符串结尾的字符除外。 So'\''
实际上是一种将单引号文字放入单引号字符串中的方法;形式上,它是“'
结束引号,\
文字'
单引号,'
开始引号”。
在 的特殊情况下grep
,如果您的实现支持它,您可以省去find
并使用grep -r
递归方式在目录中搜索:
grep -r 'add_action('\''save_post'\'',' .
¹ Linux、Cygwin、FreeBSD 和 OSX 支持这些功能。
答案3
grep "add_action('save_post'," ./* -R
您可以使用
-R
选项递归地 grep 当前目录中的所有文件。搜索字符串可以用 包围
"
。