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場合にのみ追加することです。kokomaster

例えば、次に

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 パスに出現した (または出現しなかった)master場合でも、他の場所の文字列は変更せず、URI のサーバー名部分のみを実際に変更する、より具体的な方法を使用することをお勧めします。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任意の数の先行する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

関連情報