string3を含む行で、string1をstring2に置き換えます。 string1 が複数回表示されます。

string3を含む行で、string1をstring2に置き換えます。 string1 が複数回表示されます。

次のコマンドを使用して、他の文字列(string3)を含む行の特定の文字列(string1をstring2に置き換えます)を置き換えます。

  sed -i '/string3/ s/string1/string2/' file.txt

質問...

上記のコマンドは正常に機能しますが、string3を含む行に最初にstring1が表示されたときにstring1をstring2に置き換えます。

string1のすべての項目が置き換えられたことを確認するために、コマンドを複数回実行する必要がありました。

  sed -i '/string3/ s/string1/string2/' file.txt
  sed -i '/string3/ s/string1/string2/' file.txt
  sed -i '/string3/ s/string1/string2/' file.txt

ステップ1でstring3を含む行でstring1のすべての項目を置き換える方法はありますか?

これはbashファイルを縮小するのに役立ちます。

とても感謝しています。

答え1

あなたがしなければならないのは、sedの「グローバル置換」フラグを最後に追加することだけです:

sed -i '/string3/ s/string1/string2/g' file.txt

答え2

完全性を期すために、この場合の明確な解決策はフラグを追加することですが、場合によっては(または)コマンドを複数回g実行する必要があります。s/string1/string2/s/string1/string2/g

たとえば、入力が not 、 but のstring2場合はstr次のようになります。

string1ing1

s/string1/str/g結果は次のとおりです。

string1

必要に応じてstr他のものが必要ですs/string1/str/g。これを行うには、sed以下tを使用して成功する限り、置換を実行する慣用的な方法があります。

sed '
  /string3/{
    :1
    s/string1/string2/
    t1
  }'

t:1コマンドが成功した場合にのみラベルに分岐しますs

答え3

質問にタグが付けられsed、上記の完璧な答えがありますが、ここには質問を探している人のためのawkバージョンがあります。

awk '/string3/{gsub("string1", "string2", $0)}1' infile.txt 

関連情報