Làm thế nào để loại bỏ nhiều dòng trên mỗi lần xuất hiện trong một tập tin?


10

Giả sử tôi có tệp dòng 857835 này, chứa những thứ như thế này:

a1
rubbish1
rubbish2
rubbish3
rubbish4
a1
rubbish5
rubbish6
rubbish7
rubbish8

Và tôi muốn loại bỏ tất cả các lần xuất hiện a1và dòng tiếp theo ( rubbish1rubbish5trong ví dụ này). Tôi phải làm nó như thế nào?

Tôi đã cố gắng grep 'a1' -v -A1vô ích, và kỹ năng sed của tôi không thực sự tuyệt vời:}

Google-fu của tôi đã không thể giúp tôi lần này, xin hãy giúp đỡ!

Câu trả lời:


15

Thử:

sed -e '/^a1$/,+1d' "filename"

Điều này có nghĩa là từ / ^ a1 $ / đến dòng tiếp theo, xóa

^ Và $ đảm bảo bạn khớp với toàn bộ dòng, vì vậy a1 ẩn sẽ không được khớp.


6
Bạn có thể muốn ^$trong trận đấu đó, để buộc khớp toàn bộ dòng.
Jander

@Jander: Chắc chắn, đã sửa
asoundmove

12

Phần sau đây sẽ hoạt động trên non-GNU sed( ,+1cú pháp địa chỉ là phần mở rộng GNU):

sed -e '/^a1$/,/^/d' my_file >my_filtered_file

"Bắt đầu từ một dòng đọc chính xác 'a1' và kết thúc ở dòng tiếp theo mà phần đầu của dòng tồn tại (tức là dòng tiếp theo), hãy xóa."

Tuy nhiên, nó ít mở rộng hơn câu trả lời của @ asoundmove, vì xóa một số dòng khác nhau sẽ có một kịch bản hoàn toàn khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.