
と のappendstring
両方を含む行の後に追加するために sed を使用しようとしています。Hello
World
Hello something here World
World fsf Hello
順序を考慮すると、これは機能します。
sed -i '/Hello*World\|World*Hello/a appendstring' file
しかし、一致させる文字列が多数あり、順序が整っていない場合、これはまったく効果的ではありません。
次に、順序を考慮せずに両方の文字列を含む行を削除する方法について説明した別のリンクの解決策を試しました。
https://stackoverflow.com/questions/28561519/delete-lines-that-contain-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