GNU sed --替换字符串中的 posix 和换行符

GNU sed --替换字符串中的 posix 和换行符

在 POSIXsed规范中这个说法可以找到(我的重点):

转义序列 '\n' 应与模式空间中嵌入的 <newline> 匹配。不得使用文字 <newline>在上下文地址的 BRE 中或在替代函数中。

以下带标志sed的 GNU 命令--posix与该规范相反,因为替换函数中使用了换行符。

$ printf '1X2' | sed --posix 's|X|\n|'
1
2

那么为什么sed要插入换行符而不是给出错误消息呢?

答案1

“不得使用文字 <newline>”,您的示例中没有使用文字换行符。因此,该部分标准不相关。

\n不是字面上的换行符。

答案2

--posix标志使 GNU sedPOSIX 兼容。

POSIX 保留未指定的行为s/x/\n/

未指定的 <backslash> 紧跟除“&”、<backslash>、数字、<newline> 或用于此命令的分隔符之外的任何字符的含义未指定。

所以替换xn、 用\n、 用换行符、报错、重启电脑都是合规行为。 GNU 没有理由sed想要改变它的行为。

一个合格的应用(即,在这种情况下的脚本)不得\n在那里使用,这就是您引用的文本的内容。

不同之处在于POSIX 要求将和都s/[\t]/x/g替换为,并且您将看到 GNU 的行为随之发生变化。对于 来说,POSIX 规范实际上是含糊的。 GNU改变了它的行为,以便将and替换为,但尚不清楚是否需要这样做。\txsed--posixs/[\n]/x/gsed--posix\nx

答案3

该标准规定,在搜索模式(BRE,基本正则表达式,POSIX 语言)不能使用显式换行符,并且换行符由 '\n' 表示;并且它不能用于替代品任何一个。

您的搜索模式不包含任何明确的换行符或由“\n”表示的换行符。替换中有一个“\n”。上面没有说明在替换文本中如何表示换行符(如果有的话)。 GNU sed 采用前面的说法,用 '\n' 替换意味着引入换行符。明智的。

相关内容