シェルは最後の一致後に文字列を追加します。

シェルは最後の一致後に文字列を追加します。

最後の一致の後に文字列を挿入したいと思います。たとえば、次のようになります。

バナナの最後のインスタンスの後に挿入する文字列:オレンジ色

入力する

Apple
Banana
Apple
Banana

出力

Apple
Banana
Apple
Banana
Orange

XMLタグを使用してこれを実行しようとしています。開くタグを追加する方法を見つけました。

答え1

短く簡単にすること正確に質問された内容:

printf '%s\n' '0?Banana?a' Orange . x | ex file.txt

変更をすぐに保存するのではなく、ファイルに何が保存されているかを確認するには、次のようにします。

printf '%s\n' '0?Banana?a' Orange . %p | ex file.txt

これがすること:

ファイルの先頭から0検索()戻る?regex?)は、「Banana」の次のインスタンス(囲み)を表し、a「Orange」行を追加します()。期間が終了したら、追加、保存、x終了します。

答え2

tac a | sed '0,/Banana/{s/Banana/Orange\nBanana/}' | tac

やるよ!

編集:この質問に対する回答の編集 -https://stackoverflow.com/questions/18291341/sed-only-the-last-match-pattern

答え3

sed -e:n -e'/\n.*Banana/!{$!{N' \
         -e'/Banana/bn' -eb -e\}\
         -e's/\n/&Orange&/;t'   \
         -e'/Banana/a\' -eOrange\
    -e\} -e'P;D' <<\IN
Apple
Banana
Apple
Banana
IN

Apple
Banana
Apple
Banana
Orange

これはかなり安定して動作します。パターン空間にバッファリングされます。〜サイ発生回数Banana入力時 - 新しいバッファグループが一致すると、最後のバッファグループの内容全体をstdoutとして印刷します。そして最後に登場したBananaどんな状況でも正しく処理する必要があります。どこ入力時に発生します。また、出力を書き込む前に入力ファイル全体を読み込む必要はありません。

関連情報