2013-08-17 7 views
5

sedは、テキストファイルの最後の一致パターンのみを希望します。最後の一致パターンだけをsedした

入力ファイル:

boy 
boy 
girl 
boy 

出力ファイル:

boy 
boy 
girl 
boys 
+1

http://stackoverflow.com/questions/17114807/sed-replace-last-line-matching-pattern –

答えて

7

一つの方法は、ファイルを逆にのみ最初の試合を交換して、再びそれを逆にするだろう。

tac <file> | sed '1 s/boy/boys/' | tac | sponge <newfile> 

「連結してファイルを逆順で印刷する」。スポンジは "標準入力を吸収してファイルに書き込む"。 debianの "moreutils"パッケージに入っています。

+2

'tac> newfile'と比較して' sponge'への配管のメリットは何ですか?欠点は、データが大きい場合、データをコピーしたり取り出したりしなければならない余分なパイプがあることです。これにより、処理が遅くなります。 –

+0

私は本当に問題について考えていたので、私の指が行ったもの。堅牢で万能なソリューションではありませんが、私はあなたに与えます。 – chooban

6

必要なのは$です:

sed '$s/boy/boys/' 
+5

最後の「少年」の後に別の「少女」があったとしますか?これは特定のサンプルデータで動作しますが、より一般的なものではありません。 –

0

これは(GNU SED)あなたのために働くかもしれない:

sed '1h;1!H;$!d;x;s/.*boy/&s/' file 

読まファイルメモリにと欲を用いて所望の文字列の最後の発生を置き換えます。

代わり、より少ないメモリ集約ソリューション:

sed '/.*boy/,$!b;//{x;//p;x;h};//!H;$!d;x;s//&s/' file 

これは、必要な文字列が含まれている前の行を保持するためのホールドスペースを使用し、必要な文字列の新しい出現に遭遇したときにそれらを投げかけています。ファイルの最後には、最後のオカレンスがホールドスペースにあり、変更されます。

関連する問題