当我运行这个
echo 'a\\b' | grep '\\'
它正确识别反斜杠
但是当我使用双引号时
echo 'a\\b' | grep "\\"
它没有运行并且它正在返回一个尾随的反冲错误,我无法弄清楚为什么会发生这种情况。它应该与单引号完全相似,因为我已经避开了反斜杠。
当使用双引号时,\\
被评估为\
. 单引号保持原样。做一个echo "\\"
看看我的意思。
有多个地方可以处理反斜杠转义:
"\n"
无法进行转义。这意味着当您执行时echo "a\\b"
echo 将a\b
作为第一个参数,而当您执行时echo 'a\\b'
echo 将a\\b
作为第一个参数。grep
将输入解析为具有自己的转义集的 POSIX 正则表达式。echo
默认情况下可能会或可能不会处理转义码。默认情况下,我/bin/echo
不会处理转义码,我的bash
bulitinecho
也不会,但我的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
),您还需要添加-E
到echo
命令中。
grep 做了一些基本的正则表达式匹配。
当使用双引号时,shell 会解析\\
,因此\\
将解析为单个反斜杠作为参数。
此外,grep 会进行一些基本的正则表达式匹配,因此要匹配单个反斜杠,您需要将两个反斜杠传递给 grep。
因此,通过调用grep "\\"
您实际上 get grep \
,它不会解析为正则表达式,因此会使 grep 失败。
要仅正确匹配双反斜杠,请执行grep -F '\\'
(这意味着固定字符串匹配而不是正则表达式),grep '\\\\'
或grep "\\\\\\\\"
.