2013-08-17 18 views
5

Chciałbym sed tylko ostatni wzór dopasowania pliku tekstowego.sed tylko ostatni wzór dopasowania

plik wejściowy:

boy 
boy 
girl 
boy 

plik wyjściowy:

boy 
boy 
girl 
boys 
+1

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

Odpowiedz

7

Jednym ze sposobów byłoby odwrócić plik wymienić tylko pierwszy mecz, a następnie odwrócić go z powrotem.

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

tac będzie "łączyć i drukować pliki w odwrotnej kolejności". gąbka "wchłonie standardowe wejście i zapisze w pliku". Jest w pakiecie "moreutils" na debian.

+2

Jakie są zalety instalacji do 'gąbki' w porównaniu z' tac> newfile'? Wadą, jeśli dane są duże, jest to, że istnieje dodatkowa rura, do której dane muszą być kopiowane i usuwane, co spowalnia działanie. –

+0

Po prostu to, do czego dążyły moje palce, ponieważ naprawdę myślałem o problemie. To nie jest solidne, uniwersalne rozwiązanie, udzielę ci. – chooban

6

Wszystko czego potrzebujesz to $:

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

Załóżmy, że po "chłopcu" była kolejna "dziewczyna"? Działa to na konkretnych przykładowych danych, ale nie bardziej ogólnie. –

0

To może pracować dla Ciebie (GNU sed):

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

Slurp plik do pamięci i zastąpić ostatnie wystąpienie pożądanego ciąg przy użyciu chciwość .

Alternatywny, mniej intensywnie wykorzystujących pamięć rozwiązanie:

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

ta wykorzystuje przestrzeń przytrzymaj, aby utrzymać dotychczasowe linie zawierające żądany ciąg i rzuca je, gdy nowy Występowanie wymaganej napotkaniu napisu. Na końcu pliku ostatnie wystąpienie znajduje się w przestrzeni przytrzymania i jest modyfikowane.

Powiązane problemy