次のコマンドを使用して、他の文字列(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