Sed
在 OSX 上的 sed 在某一行插入
所以我在 linux 上使用 ‘sed’ 已經有一段時間了,但是在 OSX 上使用它時遇到了一些困難,因為 ‘POSIX sed’ 和 ‘GNU sed’ 有很多細微的差別。目前我正在努力解決如何在某個行號之後插入一行文本。(在這種情況下,第 4 行)
在linux上我會做這樣的事情:
sed --in-place "4 a\ mode '0755'" file.txt
所以在 OSX 我試過這個:
sed -i "" "4 a\ mode '0755'" file.txt
但是,這一直給我一個“命令末尾 \ 之後的額外字元”錯誤。有什麼想法嗎?我有錯字嗎?還是我不理解 sed 版本之間的另一個區別?
嚴格來說,POSIX 規範
sed
要求在 之後有一個換行符a\
:[1addr]a\ text
如前所述,將文本寫入標準輸出。
這使得編寫單行程式碼有點痛苦,這可能是以下GNU對
a
、i
和c
命令進行擴展的原因:作為 GNU 擴展,如果在
a
和 換行符之間不存在空白\
序列,則從 之後的第一個非空白字元開始的該行文本將作為文本塊a
的第一行。(這可以簡化單行添加的腳本。)此擴展也適用於and命令。i``c
因此,為了便於您的
sed
語法移植,您需要在a\
不知何故之後包含一個換行符。最簡單的方法是插入一個帶引號的換行符:$ sed -e 'a\ > text'
(其中
$
和>
是 shell 提示)。如果你覺得這很痛苦,bash
$$ 1 $$具有
$' '
用於插入 C 樣式轉義的引用語法,因此只需使用sed -e 'a\'$'\n''text'
$$ 1 $$和 mksh (r39b+) 和一些非 bash bourne shell(例如,FreeBSD 9+ 中的 /bin/sh)