在 POSIXsed
规范中这个说法可以找到(我的重点):
转义序列 '\n' 应与模式空间中嵌入的 <newline> 匹配。不得使用文字 <newline>在上下文地址的 BRE 中或在替代函数中。
以下带标志sed
的 GNU 命令--posix
与该规范相反,因为替换函数中使用了换行符。
$ printf '1X2' | sed --posix 's|X|\n|'
1
2
那么为什么sed
要插入换行符而不是给出错误消息呢?
答案1
“不得使用文字 <newline>”,您的示例中没有使用文字换行符。因此,该部分标准不相关。
\n
是不是字面上的换行符。
答案2
该--posix
标志使 GNU sed
POSIX 兼容。
POSIX 保留未指定的行为s/x/\n/
:
未指定的 <backslash> 紧跟除“&”、<backslash>、数字、<newline> 或用于此命令的分隔符之外的任何字符的含义未指定。
所以替换x
为n
、 用\n
、 用换行符、报错、重启电脑都是合规行为。 GNU 没有理由sed
想要改变它的行为。
一个合格的应用(即,在这种情况下的脚本)不得\n
在那里使用,这就是您引用的文本的内容。
不同之处在于POSIX 要求将和都s/[\t]/x/g
替换为,并且您将看到 GNU 的行为随之发生变化。对于 来说,POSIX 规范实际上是含糊的。 GNU改变了它的行为,以便将and替换为,但尚不清楚是否需要这样做。\
t
x
sed
--posix
s/[\n]/x/g
sed
--posix
\
n
x
答案3
该标准规定,在搜索模式(BRE,基本正则表达式,POSIX 语言)不能使用显式换行符,并且换行符由 '\n' 表示;并且它不能用于替代品任何一个。
您的搜索模式不包含任何明确的换行符或由“\n”表示的换行符。替换中有一个“\n”。上面没有说明在替换文本中如何表示换行符(如果有的话)。 GNU sed 采用前面的说法,用 '\n' 替换意味着引入换行符。明智的。