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' 替換意味著引入換行符。明智的。

相關內容