2013-08-17 56 views
5

Tôi muốn sed chỉ mẫu đối sánh cuối cùng của tệp văn bản.sed chỉ mẫu kết hợp cuối cùng

tập tin đầu vào:

boy 
boy 
girl 
boy 

sản lượng file:

boy 
boy 
girl 
boys 
+1

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

Trả lời

7

Một phương pháp sẽ được đảo ngược các tập tin, thay thế chỉ là trận đấu đầu tiên, và sau đó đảo ngược nó trở lại một lần nữa.

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

tac sẽ "nối và in tệp ngược lại". sponge sẽ "hấp thụ đầu vào tiêu chuẩn và ghi vào một tập tin". Nó nằm trong gói "moreutils" trên debian.

+2

Lợi ích của piping với 'sponge' so với' tac> newfile' là gì? Những bất lợi, nếu dữ liệu lớn, là có thêm một đường ống mà dữ liệu phải được sao chép vào và ra khỏi, làm chậm mọi thứ. –

+0

Chỉ cần những ngón tay của tôi đã đi vì tôi nghĩ về vấn đề, thực sự. Nó không phải là một giải pháp mạnh mẽ, tất cả các mục đích, tôi sẽ cấp cho bạn. – chooban

6

Tất cả bạn cần là $:

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

Giả sử có một "cô gái" khác sau "cậu bé" cuối cùng? Điều này làm việc trên dữ liệu ví dụ cụ thể, nhưng không nói chung hơn. –

0

Điều này có thể làm việc cho bạn (GNU sed):

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

Slurp tập tin vào bộ nhớ và thay thế sự xuất hiện cuối cùng của chuỗi mong muốn sử dụng tham lam .

Một thay thế, ít bộ nhớ giải pháp chuyên sâu:

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

này sử dụng không gian tổ chức để giữ dòng trước đó chứa chuỗi cần thiết và tỏ họ khi một sự xuất hiện mới của chuỗi cần được gặp. Vào cuối tệp, lần xuất hiện cuối cùng nằm trong vùng giữ và được sửa đổi.