当我运行这个'echo'a \ b'|有什么问题grep的“\””
echo 'a\\b' | grep '\\'
它正确地识别反斜线
,但是当我用双引号
echo 'a\\b' | grep "\\"
它没有运行,它是返回一个尾随的间隙错误,我无法弄清楚为什么会发生。它应该像单引号一样工作,因为我已经避开了反斜杠。
当我运行这个'echo'a \ b'|有什么问题grep的“\””
echo 'a\\b' | grep '\\'
它正确地识别反斜线
,但是当我用双引号
echo 'a\\b' | grep "\\"
它没有运行,它是返回一个尾随的间隙错误,我无法弄清楚为什么会发生。它应该像单引号一样工作,因为我已经避开了反斜杠。
当使用双引号时,\\
被评估为\
。单引号将事物保持原样。做一个echo "\\"
看看我的意思。
grep做了一些基本的正则表达式匹配。
在双引号中,shell解析\\
,所以\\
将作为参数解析为单个反斜杠。
此外,grep会执行一些基本的正则表达式匹配,所以要匹配单个反斜杠,您需要将两个反斜杠传递给grep。
所以通过调用grep "\\"
你实际上得到了grep \
,它不会作为正则表达式解析,因此会导致grep失败。
要正确地匹配双反斜杠,请执行grep -F '\\'
(表示固定字符串匹配而不是正则表达式),grep '\\\\'
或grep "\\\\\\\\"
。
有多种地方反斜杠可以加工:
"\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
命令。
回声需要-e将斜线解释为逃避不? – 2013-02-10 13:17:25
shell在双引号中解释\\。 echo -e'\\'的结果与'echo“\\”'相同。 – afflux 2013-02-10 13:23:00