2013-09-27 51 views
5
aaa aaaa aaaa aaaa 
sss ssss ssss ssss 
ddd dddd dddd dddd 
fff ffff ffff ffff 
abc pattern asd fde 
111 222 333 444 555 
666 777 888 999 000 

đầu ra mong muốn: Nếuxóa tất cả mọi thứ trước khi mô hình bao gồm mô hình sử dụng awk hoặc sed

111 222 333 444 555 
666 777 888 999 000 
+2

Cố gắng không để suy nghĩ và xác định các vấn đề về những gì bạn muốn xóa từ một tập tin mà thay vào đó về những gì bạn muốn chọn từ một tập tin - nó thường làm cho sự khác biệt về khả năng đọc, bảo trì, vv của các giải pháp mà bạn (và chúng tôi) đưa ra cho vấn đề của bạn. –

Trả lời

10

Chỉ cần thiết lập một lá cờ mỗi khi mô hình được tìm thấy. Từ thời điểm đó trở đi, in các dòng:

$ awk 'p; /pattern/ {p=1}' file 
111 222 333 444 555 
666 777 888 999 000 

Hoặc cũng

awk '/pattern/ {p=1;next}p' file 

Có vẻ cho pattern trong mỗi dòng. Khi được tìm thấy, biến số p được đặt thành 1. Điểm khó hiểu là các đường chỉ được in khi p>0, để các dòng sau sẽ được in.

Đây là trường hợp cụ thể của How to select lines between two patterns? khi không có mẫu thứ hai như vậy.

+1

'next' có thể được lưu ...' awk 'p;/pattern/{p = 1}' ';) – Kent

+0

Tôi phải nói, câu trả lời ban đầu của bạn dễ đọc và dễ hiểu hơn. đặc biệt nếu kịch bản dài. – Kent

+0

awk 'p;/pattern/{p = 1} 'file –

8
sed '1,/pattern/d' file 

hoạt động cho ví dụ của bạn.

sed '0,/pattern/d' file 

đáng tin cậy hơn.

+2

Có. Trừ khi 'mẫu' được tìm thấy trong dòng đầu tiên. Tốt hơn nên bắt đầu phạm vi trong '0'. – Birei

+0

@Birei gợi ý tốt đẹp. ! – Kent

+0

Hãy coi chừng mặc dù khi không tìm thấy mẫu, việc này sẽ xóa mọi thứ. –

2

Một số khác sed giải pháp:

sed ':loop;/pattern/{d};N;b loop' file.txt 
+0

Đây có vẻ là giải pháp duy nhất không xóa mọi thứ khi không tìm thấy mẫu. –

Các vấn đề liên quan