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

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

答案1

sed -i '/kokomaster/!s/master/koko&/' file

首先測試該字串是否kokomaster存在於該行,如果不存在,則進行替換。這幾乎是「但我們想要的是koko僅在單字koko之前不存在時才將單字加入」的字面翻譯。mastersed

替換的替換部分中的&將會被替換為與模式部分相符的文字(即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或者其他一些專門為處理該格式的文件而編寫的適當工具。

答案2

使用

sed 's/\(koko\)*master/kokomaster/'

因此master,任意數量的前面的kokos 都會被替換。

答案3

你可以多替換一點來避免這個問題:

sed -i sX/masterX/kokomasterX file

這會替換“/master”,因此下次運行它時,不會替換任何內容,因為“/kokomaster”不匹配。

答案4

我使用下面的 awk 命令來執行相同的操作

命令

awk '$0 !~/kokomaster/{gsub("master","kokomaster",$0)}1'  filename >file_tmp && mv file_tmp filename

輸出

discovery.uri=http://kokomaster.navada.com:8800
discovery.uri=http://kokomaster.navada.com:8800

相關內容