如何将带单引号的字符串传递给 grep?

如何将带单引号的字符串传递给 grep?

我期望的结果如下:递归搜索目录,在所有找到的文件中查找给定的字符串。以下命令是我常用的调用端口:

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\', .

最后一条命令解释为:

  1. 'add_action('->add_action(
  2. \'->'
  3. save_post->save_post
  4. \'->'
  5. ,->,

连接这些部分,该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
  1. 您可以使用-R选项递归地 grep 当前目录中的所有文件。

  2. 搜索字符串可以用 包围"

相关内容