3 回答

TA貢獻1807條經驗 獲得超9個贊
不要逃避反斜杠; 你會迷惑自己。s在文本中沒有出現的命令后使用不同的符號(我%在下面的示例中使用):
line_old='myparam /path/to/a argB=/path/to/B xo'
line_new='myparam /path/to/c argB=/path/to/D xo'
sed -i "s%$line_old%$line_new%g" /etc/myconfig
另外,用雙引號括起整個字符串; 使用單引號意味著sed看到$line(在原始中)而不是擴展值。在單引號內,沒有擴展,也沒有元字符。如果您的文本幾乎可以包含任何純文本字符,請使用控制字符(例如control-A或control-G)作為分隔符。
請注意,-i這里的使用反映了問題中的內容,但假定使用GNU sed。BSD sed(在Mac OS X上也可以找到)需要后綴。你可以用sed -i '' …原位替換; 這與GNU不兼容sed。要在兩者之間攜帶,請使用-i.bak; 這將適用于兩者 - 但為您提供了一個您可能想要刪除的備份文件。其他Unix平臺(例如AIX,HP-UX,Solaris)可能具有sed根本不支持的變體-i。POSIX規范不要求它sed。

TA貢獻1842條經驗 獲得超13個贊
-e
除非你有多個表達式(sed -e 's/a/b/' -b 's/xy/ZZ/g'
) - AFAIK,否則它是可選的。使用sed -i -e …
會使腳本在GNU sed
和BSD 之間“可移植” sed
,代價是讓BSD sed
創建帶擴展名的備份文件-e
(因此,如果你編輯文件data
,Mac OS X上的備份文件將是data-e
; GNU sed
將不會創建備份)。我不確定這是否足夠理由以這種方式做事; 最好使用-i.bak
和刪除備份 - 這適用于兩種變體。
添加回答
舉報