以下是 sed
指挥
echo '.' | sed "s/\\./foo/"
sed "s .
与 foo
,正如预期的那样。然而,如果我们对非字母数字的 .
在上面的命令中
echo '.' | sed "s/\\\./foo/"
勉强 .
而 foo
是预期。sed
应符合字符 .
从字面上看,但它没有。我不明白这个点是怎么回事。我认为在bash中,如果一个字符串是双引号,我应该在每一个非字母数字字符前面加一个反斜杠。点是一个非字母数字字符,那么对它进行转义有什么问题,为什么会产生不同的结果?
这是因为反斜杠在bash中的工作方式是双引号。"
逃离。
echo "\\"
\
echo "\."
\.
echo "s/\\./foo/"
s/\./foo/
echo "s/\\\./foo/"
s/\\./foo/
从 man bash
:
Within double quotes, the backslash retains its special meaning only when
followed by one of the following characters: $, `, ", \,or <newline>.
所以在第一种情况下,sed得到 s/\./foo/
并将其解释为 "用foo替换一个点"。在第二种情况下,sed得到 s/\\./foo/
并将其解释为 "将反斜杠和另外一个字符替换为foo。
在这种情况下,你最好使用单引号转义。
echo 's/./foo/'
s/./foo/
echo 's/\./foo/'
s/\./foo/
这可能就是你想要的.
在你的第二种情况下 .
仍然是一个点,但正则表达式只替换了两个字符的序列。\.
(不是 .
单独 foo
:
$ echo '=\.=' | sed "s/\\\./foo/"
=foo=