sed + 仅当不存在时才在字符串前添加单词

yae*_*ael 3 sed configuration text-processing

我们在 Linux 上的文件中有以下行:

discovery.uri=http://master.navada.com:8800
Run Code Online (Sandbox Code Playgroud)

我们想在koko之前添加这个词master,所以我只是这样做:

sed –i 's/master/kokomaster/' file
Run Code Online (Sandbox Code Playgroud)

这使:

discovery.uri=http://kokomaster.navada.com:8800
Run Code Online (Sandbox Code Playgroud)

但我们想要的是koko仅在koko之前不存在的情况下添加master

例如,下次我们运行

sed –i 's/master/kokomaster/' file
Run Code Online (Sandbox Code Playgroud)

该行将是:

discovery.uri=http://kokokokomaster.navada.com:8800
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 6

sed -i '/kokomaster/!s/master/koko&/' file
Run Code Online (Sandbox Code Playgroud)

首先测试该字符串是否kokomaster存在于行上,如果不存在,则进行替换。这几乎是“但我们想要的是kokokokomaster单词之前不存在的情况下才将单词添加到”中的字面翻译sed

&在所述取代的替换部分将通过由图案部分(即匹配的文本被替换master)。


阅读评论后(见下文),您可能想要使用更具体的内容,实际上只会修改 URI 的服务器名称部分,而不是master其他地方的任何字符串,即使kokomaster在 URI 路径中出现(或未出现):

sed -i 's,^\(discovery\.uri=http://\)\(master\),\1koko\2,' file
Run Code Online (Sandbox Code Playgroud)

您甚至可能想要匹配您想要替换的确切和完整的行,只是为了避免甚至假设错误:

sed -i 's,^\(discovery\.uri=http://\)\(master\.navada\.com:8800\)$,\1koko\2,' file
Run Code Online (Sandbox Code Playgroud)

如果配置文件是用JSON或其他一些众所周知的格式,你会不会使用sed在所有的,但jq还是有些其他apropriate工具,专门用于处理这种格式的文件写入。


Phi*_*pos 5

使用

sed 's/\(koko\)*master/kokomaster/'
Run Code Online (Sandbox Code Playgroud)

因此master,任意数量的前面的kokos 都会被替换。