Text-Processing

sed + 僅當不存在時才在字元串前添加單詞

  • June 6, 2019

我們在 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其他專門為處理該格式文件而編寫的適當工具。

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