In các dòng giữa (và bao gồm) hai mẫu


16

Tôi muốn bắt đầu grepping từ các dòng có CKở cuối dòng và dừng grepping khi dòng có Dở cuối. Tôi đã thử grep "$CK" "$D" file..txt, nhưng nó không hoạt động.

Đầu vào:

kkkkkkkkkkk   
jjjjjjjjjjjjjjjjjj  
gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D  
GGGGGGGGGGGGGG  
GGGGGGGGGGGGGG

Đầu ra mong muốn:

gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D

Câu trả lời:


21

Bạn nên sử dụng hoặc

awk '/CK$/,/D$/' file.txt

HOẶC LÀ

sed -n '/CK$/,/D$/p' file.txt

Nếu bạn nhấn mạnh vào , đây là cách GNU grep

grep -oPz '(?s)(?<=\n)\N+CK\n.*?D(?=\n)' file.txt

Đây

-P kích hoạt perl-regapi

-zđặt dấu phân cách dòng thành NUL. Điều này buộc grep phải xem toàn bộ tệp dưới dạng một dòng

-o chỉ in phù hợp

(?s)kích hoạt PCRE_DOTALL, vì vậy .tìm thấy bất kỳ ký tự hoặc dòng mới nào

\N phù hợp với bất cứ điều gì ngoại trừ dòng mới

.*?tìm thấy. trong chế độ vô nghĩa

(?<=..) là một khẳng định phía sau

(?=..) là một khẳng định về phía trước


Tại sao không thêm dấu gạch chéo? như thế nàyawk '/\/CK/,/\/D/' input
Rahul Patil

@RahulPatil, đó là vì OP đã tuyên bố 'bắt đầu greping từ các dòng có "CK" ở cuối dòng và dừng grepping khi dòng có "D"'
iruvar

có vẻ như tôi, bạn có hiểu biết sâu sắc về regex .. Tôi không hiểu mức độ đó, vì vậy bạn có thể giải thích rằng cuối cùng của PCRE grep
Rahul Patil

@RahulPatil, đã thêm một số lời giải thích :-)
iruvar

@RohitPatil, tôi muốn xóa lựa chọn phù hợp khỏi tệp. tôi có thể làm điều đó?
Rana Khan

0

Nếu bạn đang sử dụng BSD grep(không hỗ trợ perl regex param -P), thì đây là cách giải quyết:

grep -o "aaa.*cdn" <(paste -sd_ file) | tr '_' '\n'

Điều này hoạt động bằng cách nối tất cả các dòng (thay thế các dòng mới bằng _ký tự), kiểm tra mẫu một dòng và mở rộng các dòng trở lại trạng thái ban đầu.

Nếu bạn đang sử dụng GNU grep, bạn có thể đạt được kết hợp nhiều dòng trong grep, nhưng bạn cần sử dụng perl-regapi cho grep( -P) như được đề cập trong câu trả lời khác . Bạn vẫn có thể cài đặt GNU greptrên macOS thông qua brew install grepvà sử dụng ggrepthay thế.


Ngoài ra, bạn có thể sử dụng pcregrephỗ trợ các mẫu nhiều dòng ( -M).


Bạn cũng có thể sử dụng exlệnh, ví dụ:

ex +"/aaa/;/cdn/p" -scq! file
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.