sed は、順序付けられていない複数の文字列を含む行の後に追加します。

sed は、順序付けられていない複数の文字列を含む行の後に追加します。

と のappendstring両方を含む行の後に追加するために sed を使用しようとしています。HelloWorld

Hello something here World
World fsf Hello

順序を考慮すると、これは機能します。

sed -i '/Hello*World\|World*Hello/a appendstring' file

しかし、一致させる文字列が多数あり、順序が整っていない場合、これはまったく効果的ではありません。

次に、順序を考慮せずに両方の文字列を含む行を削除する方法について説明した別のリンクの解決策を試しました。

https://stackoverflow.com/questions/28561519/delete-lines-that-c​​ontain-two-strings

しかし、

sed -i '/Hello/!b;/World/d' file

これは削除にも機能しません。

次のものも、その質問に対する答えの 1 つです。

sed -i '/Hello/{/World/d}' file

作品、そこで追加するように実装してみました。以下を使用します:

sed -i '/Hello/{/World/a} appendstring' file

しかし、エラーが発生しました:

sed: -e expression #1, char 0: unmatched `{'

アップデート: リンクの投稿には !b を使用した解決策が記載されており、感嘆符のため cshell では機能しませんでしたが、sh と bash では機能します。また、スクリプト内で sed を実行するときに多数の行を挿入したり、大きな段落を追加したりするように簡単に拡張することもできます。

sed -i '/Hello/!b; /World/a \
addline \
addanotherline ' file

答え1

ほぼ成功しました:

sed -i '/Hello/{/World/a} appendstring' file

引数を区切る必要があります。-eを次のように使用します。

sed -i -e '/Hello/{/World/a appendstring' -e '}' file

注意:1つの改行のない ppend コマンドは、-iスイッチと同様に GNU 拡張です。


これをより移植性の高いものにし、複数の文字列が一致する可能性も考慮するには、次を試してください。

sed '/multiple/{/words/{/to/{/match/ s/$/append this/;};};}' file > newfile
mv newfile file

すでに GNU Sed を使用している場合は、次のようにします。

sed -i -e '/multiple/{/words/{/to/{/match/ a append this' -e 'a and also this' -e 'a oh and this too' -e '};};}' file

関連情報