
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
場合でも、他の場所の文字列は変更せず、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
任意の数の先行する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