Sed

在 OSX 上的 sed 在某一行插入

  • February 9, 2022

所以我在 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

如前所述,將文本寫入標準輸出。

這使得編寫單行程式碼有點痛苦,這可能是以下GNUaic命令進行擴展的原因:

作為 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)

引用自:https://unix.stackexchange.com/questions/52131