Text-Processing
sed + 僅當不存在時才在字元串前添加單詞
我們在 Linux 上的文件中有以下行:
discovery.uri=http://master.navada.com:8800
我們想在
koko
之前添加單詞master
,所以我只是這樣做:sed –i 's/master/kokomaster/' file
這使:
discovery.uri=http://kokomaster.navada.com:8800
但我們想要的是
koko
僅在koko
之前不存在時才添加master
。例如,下一次我們執行
sed –i 's/master/kokomaster/' file
該行將是:
discovery.uri=http://kokokokomaster.navada.com:8800
你可以多換一點來避免這個問題:
sed -i sX/masterX/kokomasterX file
這將替換“/master”,因此下次執行它時,不會替換任何內容,因為“/kokomaster”不匹配。
sed -i '/kokomaster/!s/master/koko&/' file
首先測試該字元串是否
kokomaster
存在於該行中,如果不存在,則進行替換。這幾乎是“但我們想要的是koko
僅當單詞koko
之前不存在時才添加單詞master
”的字面翻譯sed
。替換的
&
替換部分中的 將被模式部分匹配的文本替換(即master
)。閱讀評論(見下文)後,您可能希望使用更具體的內容,實際上只會修改 URI 的伺服器名稱部分,而不是其他任何
master
地方的任何字元串,即使kokomaster
在 URI 路徑中發生(或不發生):sed -i 's,^\(discovery\.uri=http://\)\(master\),\1koko\2,' file
您甚至可能想要匹配您想要替換的確切和完整的行,以避免甚至假設錯誤:
sed -i 's,^\(discovery\.uri=http://\)\(master\.navada\.com:8800\)$,\1koko\2,' file
如果配置文件是用 JSON 或其他眾所周知的格式編寫的,那麼您根本不會**使用
sed
,而是使用jq
其他專門為處理該格式文件而編寫的適當工具。