2013-02-10 57 views
0

当我运行这个'echo'a \ b'|有什么问题grep的“\””

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

它正确地识别反斜线

,但是当我用双引号

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

它没有运行,它是返回一个尾随的间隙错误,我无法弄清楚为什么会发生。它应该像单引号一样工作,因为我已经避开了反斜杠。

回答

4

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

+0

回声需要-e将斜线解释为逃避不? – 2013-02-10 13:17:25

+1

shell在双引号中解释\\。 echo -e'\\'的结果与'echo“\\”'相同。 – afflux 2013-02-10 13:23:00

1

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

在双引号中,shell解析\\,所以\\将作为参数解析为单个反斜杠。

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

所以通过调用grep "\\"你实际上得到了grep \,它不会作为正则表达式解析,因此会导致grep失败。

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

3

有多种地方反斜杠可以加工:

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

所以,如果你调用grep "\\"外壳将处理\\转义序列,并通过\到grep将尝试解析为正则表达式和correclty抱怨斜杠。

所以当你使用双引号时,你必须加倍逃避所有导致相当笨拙的echo 'a\\b' | grep "\\\\"

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

+0

感谢您的回答,在回声中使用-E有什么用,单引号忽略所有元宪章的特殊含义呢? – Dude 2013-02-10 13:25:44

+0

我部分误解了你的问题,因为我的'echo'进程在默认情况下转义,并且假定你只打印一个反斜杠,因为你只能为其中一个反转。 'echo'程序本身并不知道您是使用单引号还是双引号。 – jix 2013-02-10 13:28:52

+0

我的意思是 - 当要打印的值是单引号'时,这是多余的'..' – Dude 2013-02-10 13:31:27