Linuxのファイルには次の行があります。
discovery.uri=http://master.navada.com:8800
koko
beforeという単語を追加したい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パスの途中に表示または表示されなくても、実際にはURIのサーバー名部分のみを変更し、master
他の場所では文字列を変更しないより具体的なものを使用できます。kokomaster
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
置き換えられます。
答え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