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