
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
之前不存在時才將單字加入」的字面翻譯。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
或者其他一些專門為處理該格式的文件而編寫的適當工具。
答案2
使用
sed 's/\(koko\)*master/kokomaster/'
因此master
,任意數量的前面的koko
s 都會被替換。
答案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