0

当我运行这个

echo 'a\\b' | grep '\\'

它正确识别反斜杠

但是当我使用双引号时

echo 'a\\b' | grep "\\"

它没有运行并且它正在返回一个尾随的反冲错误,我无法弄清楚为什么会发生这种情况。它应该与单引号完全相似,因为我已经避开了反斜杠。

4

3 回答 3

4

当使用双引号时,\\被评估为\. 单引号保持原样。做一个echo "\\"看看我的意思。

于 2013-02-10T13:10:41.720 回答
3

有多个地方可以处理反斜杠转义:

  • 在您的外壳中:当您使用双引号而不是单引号时会发生这种情况。请注意,这是一个非常有限的处理,并且"\n"无法进行转义。这意味着当您执行时echo "a\\b"echo 将a\b作为第一个参数,而当您执行时echo 'a\\b'echo 将a\\b作为第一个参数。
  • 在您调用的程序中:grep将输入解析为具有自己的转义集的 POSIX 正则表达式。echo默认情况下可能会或可能不会处理转义码。默认情况下,我/bin/echo不会处理转义码,我的bashbulitinecho也不会,但我的zsh内置echo会。如果需要某种行为,可以通过-e启用转义或-E禁用转义来指定。

因此,如果您调用grep "\\"shell 将处理\\转义序列并传递\给 grep,它将尝试将其解析为正则表达式,并且 correclty 抱怨尾随反斜杠。

因此,当您使用双引号时,您必须对所有内容进行双重转义,从而导致相当笨拙的echo 'a\\b' | grep "\\\\".

要获得最少的转义,您可以使用echo 'a\\b' | grep '\\'or echo 'a\\b' | grep -F '\',其中-F标志告诉 grep 将模式解释为逐字字符串而不是正则表达式。如果您碰巧有一个echo进程默认转义(这将导致echo 'a\\b'打印a\b),您还需要添加-Eecho命令中。

于 2013-02-10T13:22:01.197 回答
1

grep 做了一些基本的正则表达式匹配。

当使用双引号时,shell 会解析\\,因此\\将解析为单个反斜杠作为参数。

此外,grep 会进行一些基本的正则表达式匹配,因此要匹配单个反斜杠,您需要将两个反斜杠传递给 grep。

因此,通过调用grep "\\"您实际上 get grep \,它不会解析为正则表达式,因此会使 grep 失败。

要仅正确匹配双反斜杠,请执行grep -F '\\'(这意味着固定字符串匹配而不是正则表达式),grep '\\\\'grep "\\\\\\\\".

于 2013-02-10T13:12:27.587 回答