sed 需要 `\\\n` 来添加新行

sed 需要 `\\\n` 来添加新行

我正在尝试使用 添加新行sed,只有当我像这样添加新行时它才有效\\\n::

echo "sometextutf8_filesystemmmmm" | sed -r "/utf8_filesystem/a \\\n# Passive mode"

输出:

sometextutf8_filesystemmmmm

# Passive mode

一个或两个反斜杠即可不是有效!使用一个\n或两个\\n反斜杠,我只会得到以下输出:

sometextutf8_filesystemmmmm
n# Passive mode

没有任何新行。

尽管如此,它无需替换三个反斜杠即可正常工作:

echo "sometextutf8_filesystemmmmm" | sed -r "s/utf8_filesystem/\n# Passive mode/"

输出:

sometext
# Passive modemmmm

有人可以解释这种行为吗?

答案1

我无法使用 bash 重现您的问题。

$ echo aaa | sed -r 's/aaa/AAA \n#Passive mode/'
AAA
#Passive mode

$ myprog=sed

$ echo aaa | $myprog -r "s/aaa/AAA \n#Passive mode/"
AAA
#Passive mode

所以我怀疑这件事还有更多不该在问题中提到的东西。


可能是因为

1)你可能有一些复杂的脚本和/或别名和/或环境变量,导致你的参数被多次评估,并且

2) 您使用的引号类型错误。使用时,"Params"shell 会将转义符转换\\\

您可能更喜欢使用单引号:'params'

比较

$ echo "s/aaa/AAA \\\n#BBB/"
s/aaa/AAA \\n#BBB/

$ echo 's/aaa/AAA \\\n#BBB/'
s/aaa/AAA \\\n#BBB/

答案2

您必须使用单引号。使用双引号时,特殊字符不会被按字面意思理解,因此每当您使用反斜杠时,都必须用另一个反斜杠跳过它。使用单引号时,所有内容都会按字面意思理解,因此您不必跳过特殊字符“空格、美元符号……等等”。

您可以通过 Google 阅读有关 Linux Bourne-Again shell 中单引号和双引号之间的区别的更多信息。

相关内容