Trích xuất tập hợp con các dòng của một tệp dựa trên regex cho dòng đầu tiên và cuối cùng


7

Tôi có một tệp văn bản lớn và tôi chỉ muốn xem một số dòng. Dòng đầu tiên tôi muốn khớp với regex Rvà khi dòng này khớp với regex S, tôi không quan tâm đến dòng đó hoặc bất kỳ dòng nào sau đây. Các dòng ở giữa sẽ không khớp R. Có cách nào để làm điều này trên dòng lệnh trong lệnh bash để tôi có thể dẫn đầu ra ở đâu đó sau không?


2
Vui lòng cho ví dụ đầu vào và đầu ra, và điều gì có nghĩa là một dòng ở giữa? Không phải là đầu tiên và không phải là dòng cuối cùng?
hỗn loạn

Đối với GNUsed '/R/,/S/!d;/S/Q' large.text.file
Costas

sed --posix -n '/R/{:1;p;n;/S/!b1;};/S/q'
Di

POSIX của bạn không phải là POSIX ( ;là ký tự hợp lệ trong tên của nhãn, bạn cần ;trước }(và không thể có bất cứ thứ gì sau)
Stéphane Chazelas

2
@chaos, mặc dù một ví dụ có thể giúp ích, câu hỏi được chỉ định rõ ràng mà không có bất kỳ sự mơ hồ nào (câu hỏi duy nhất có thể là liệu một dòng có thể khớp với cả R và S hay không) ở đây hiếm khi được ca ngợi. Nó chắc chắn không đảm bảo đóng cửa là không rõ ràng.
Stéphane Chazelas

Câu trả lời:




2

Với awk

awk 'x&&/S/{exit};x+=/R/' file

Thí dụ

seq 20 | awk 'x&&/1/{exit};x+=/6/'
6
7
8
9

Nó có thể được tối ưu hóa bằng cách không tìm kiếm Rnhư sauawk '/R/,0{if (/S/) exit; print}'
Stéphane Chazelas

@ StéphaneChazelas Tuyệt vời, đừng chỉnh sửa câu trả lời của tôi để thêm dấu hai chấm không cần thiết :)

dấu chấm phẩy được yêu cầu bởi POSIX.
Stéphane Chazelas

@ StéphaneChazelas Không họ không? Atleast không khi sử dụng --posixhay --compatđối số? Ngoài ra để tối ưu hóa của bạn, tôi nghi ngờ rằng sẽ làm cho thậm chí một giây khác biệt trên một tệp terabyte.

Trên thực tế, tôi thậm chí đã từng gửi yêu cầu tới nhóm Austin để hạn chế được nới lỏng vì tôi không thể tìm thấy bất kỳ triển khai nào thực thi nó nhưng nó đã bị từ chối bởi người duy trì GNU awk. (xin lưu ý rằng các bình luận của tôi không bao giờ có ý định đối đầu, chỉ khi thêm thông tin).
Stéphane Chazelas

-1

Tôi đã viết một chương trình để giải quyết việc này fromto

Bạn có thể sử dụng nó như thế này:

cat file | fromto -f R -T S

Trong trường hợp Rlà regex bạn muốn lấy từ , và Slà regex bạn muốn lấy để . Nó sẽ in ra tất cả các dòng giữa hai. -fcó nghĩa là "bao gồm dòng 'từ', -Fcó nghĩa là" không bao gồm dòng 'từ'. Tương tự như vậy với -t/ -T. Câu hỏi là loại trừ dòng 'thành', do đó -Tlà đối số cho yêu cầu đó. Nếu bạn đã sử dụng, -tnó sẽ in dòng 'đến' (nhưng không phải dòng sau đó)


Plese giải thích về ứng dụng của bạn.
Tiếng Ba

Tôi đã mở rộng này để bao gồm các chi tiết.
Rory
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.