首页 > 解决方案 > 转义文字点如何为 sed 工作

问题描述

以下sed命令

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

正如预期的那样,替换.为。但是,如果我们在上述命令中foo转义非字母数字.

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

几乎不打印.,而foo预期。sed应该从字面上匹配字符.,但事实并非如此。我无法理解点发生了什么。我相信如果字符串被双引号括起来,我应该在 bash 中的每个非字母数字字符前面简单地放一个反斜杠。点是非字母数字字符,那么转义它有什么问题,为什么会产生不同的结果?

标签: regexbashseddouble-quotes

解决方案


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

这可能是你想要的。


推荐阅读