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

Mat*_*hew 3 grep find xargs escape-characters

我想要的结果如下:递归搜索目录,在所有找到的文件中查找给定的字符串。以下命令是我通常的停靠港:

find ./ | xargs grep -ns 'foobar'
Run Code Online (Sandbox Code Playgroud)

但是,当foobar有引号时,命令失败并>在 shell 中给我一个提示。导致问题的具体命令如下:

find ./ | xargs grep -ns 'add_action(\'save_post\','
Run Code Online (Sandbox Code Playgroud)

我试图用反斜杠转义引号,但无济于事。这样做的正确方法是什么?

Lek*_*eyn 7

单引号以单引号结尾;中间的所有其他字符都按原样保留,包括反斜杠。因此无法在单引号之间嵌入单引号。(但您可以结束单引号,转义单引号,并开始一组新的单引号,如'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\', .
Run Code Online (Sandbox Code Playgroud)

最后一条命令被解释为:

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

连接这些部分,grep命令接收参数add_action('save_post',