亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

sed搜索并替換包含/ 的字符串

sed搜索并替換包含/ 的字符串

PIPIONE 2019-09-03 16:36:49
我無法弄清楚如何使用sed來搜索和替換/文本文件中包含該字符的字符串/etc/myconfig。例如,在我現有的文本文件中,我有:myparam /path/to/a argB=/path/to/B xo我希望將其替換為:myparam /path/to/c argB=/path/to/D xo我嘗試在bash中這樣做:line='myparam /path/to/a argB=/path/to/B xo'line_new='myparam /path/to/c argB=/path/to/D xo'sed -i 's/$line/$line_new/g' /etc/myconfig但沒有任何反應。嘗試grep -rn "$line" /etc/myconfig雖然回來了'myparam /path/to/a argB=/path/to/B xo'。表達sed執行此搜索并替換并正確處理命令的命令的正確方法是什么/?(我認為/我的字符串中的字符是給我問題的字符,因為我使用類似的sed命令來搜索和替換文本文件中的另一行沒有問題,并且該行沒有/字符。
查看完整描述

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。


查看完整回答
反對 回復 2019-09-03
?
紅顏莎娜

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和刪除備份 - 這適用于兩種變體。

查看完整回答
反對 回復 2019-09-03
  • 3 回答
  • 0 關注
  • 2535 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號