我在运行时
echo 'a\\b' | grep '\\'
它正确识别反斜杠
但是当我使用双引号时
echo 'a\\b' | grep "\\"
它没有运行,它返回一个尾随反冲错误,我无法弄清楚为什么会发生这种情况。它应该与单引号完全相似,因为我已经转义了反斜杠。
答案 0 :(得分:4)
使用双引号时,\\
会被评估为\
。单引号保持原样。做一个echo "\\"
看看我的意思。
答案 1 :(得分:3)
有多个地方可以处理反斜杠转义:
"\n"
这样的转义不起作用。这意味着当您执行echo "a\\b"
echo时,a\b
将作为第一个参数,而当您执行echo 'a\\b'
时,echo将获得a\\b
作为第一个参数。grep
将输入解析为具有自己的转义集的POSIX正则表达式。 echo
默认情况下可能会也可能不会处理转义码。我的/bin/echo
默认情况下不会处理转义码,我的bash
bulitin echo
也赢了,但我的zsh
内置echo
会。如果需要某个行为,可以由-e
指定启用转义,或由-E
指定禁用转义。因此,如果您正在调用grep "\\"
,shell将处理\\
转义序列并将\
传递给grep,后者将尝试将其解析为正则表达式并且相关的抱怨关于一个尾随反斜杠。
所以当你使用双引号时,你必须双重转义所有导致相当笨拙的echo 'a\\b' | grep "\\\\"
。
为了获得最少量的转义,您可以使用echo 'a\\b' | grep '\\'
甚至echo 'a\\b' | grep -F '\'
,其中-F
标志告诉grep将模式解释为逐字字符串而不是正则表达式。如果您碰巧有echo
默认处理转义(这会导致echo 'a\\b'
打印a\b
),您还需要将-E
添加到echo
命令。
答案 2 :(得分:1)
grep做了一些基本的正则表达式匹配。
当使用双引号时,shell会解析\\
,因此\\
将解析为单个反斜杠作为参数。
此外,grep执行一些基本的正则表达式匹配,因此要匹配单个反斜杠,您需要将两个反斜杠传递给grep。
因此,通过调用grep "\\"
实际得到grep \
,它不会解析为正则表达式,因此会使grep失败。
要正确匹配双反斜杠,请执行grep -F '\\'
(这意味着修复字符串匹配而不是正则表达式),grep '\\\\'
或grep "\\\\\\\\"
。