sed "s

问题描述 投票:0回答:1

以下是 sed 指挥

echo '.' | sed "s/\\./foo/"

sed "s .foo,正如预期的那样。然而,如果我们对非字母数字的 . 在上面的命令中

echo '.' | sed "s/\\\./foo/"

勉强 .foo 是预期。sed 应符合字符 . 从字面上看,但它没有。我不明白这个点是怎么回事。我认为在bash中,如果一个字符串是双引号,我应该在每一个非字母数字字符前面加一个反斜杠。点是一个非字母数字字符,那么对它进行转义有什么问题,为什么会产生不同的结果?

regex bash sed double-quotes
1个回答
3
投票

这是因为反斜杠在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/

这可能就是你想要的.


1
投票

在你的第二种情况下 . 仍然是一个点,但正则表达式只替换了两个字符的序列。\. (不是 . 单独 foo:

$ echo '=\.=' | sed "s/\\\./foo/"
=foo=
© www.soinside.com 2019 - 2024. All rights reserved.