sed + 存在しない場合のみ、文字列の前に単語を追加します。

sed + 存在しない場合のみ、文字列の前に単語を追加します。

Linuxのファイルには次の行があります。

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

kokobeforeという単語を追加したい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だけを追加することです」をほとんど文字通り翻訳したものです。kokomastersed

交換の交換部分は、&パターン部分(たとえば)に一致するテキストで置き換えられます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

関連情報