最後の一致の後に文字列を挿入したいと思います。たとえば、次のようになります。
バナナの最後のインスタンスの後に挿入する文字列:オレンジ色
入力する
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
どんな状況でも正しく処理する必要があります。どこ入力時に発生します。また、出力を書き込む前に入力ファイル全体を読み込む必要はありません。