[ad_1]
grep
là một tiện ích tìm kiếm văn bản dòng lệnh có thể tìm các mẫu và chuỗi trong tệp và các loại đầu vào khác. Hầu hết các trận đấu sẽ chỉ khớp trên một dòng, nhưng nó thường hữu ích nếu khớp trên nhiều dòng mới.
Kết hợp giữa nhiều dòng mới với grep
Xử lý các trận đấu nhiều dòng là một cái gì đó grep
đấu tranh với. Một công cụ tốt hơn cho công việc là awk
hoặc sed
, cả hai đều xử lý đầu vào nhiều dòng một cách tự nhiên. Sử dụng hai biểu thức có dấu phẩy ở giữa chúng sẽ khớp mọi thứ ở giữa hai mẫu đó.
awk '/from/,/to/' file sed -n '/from/,/to/p' file
Vẫn có thể xử lý vấn đề này trong grep
tuy nhiên, lệnh này rất khó hiểu.
grep -Pz '(?s)from.*n.*to' test
Điều này thực hiện một số điều:
-P
Bật Regex tương thích Perl.-z
cung cấp toàn bộ tệp dưới dạng một dòng, với “không byte” thay vì một dòng mới. Điều này cho phép grep xử lý toàn bộ thành một dòng.(?s)
bật PCRE_DOTALL, điều này làm cho.
ký tự khớp với bất kỳ ký tự nào, bao gồm cả dòng mới.from
là trận đấu bắt đầu..*n.*
sẽ khớp mọi thứ cho đến khito
đó là trận đấu kết thúc.
Nhìn chung, điều này sẽ được thực hiện cho mục đích viết kịch bản, nhưng bạn phải nhớ khá nhiều điều nếu bạn đang tự gõ nó ra. Ngoài ra, bằng cách sử dụng -o
cờ để in kết quả phù hợp cũng sẽ in ra một ký tự byte 0 ở cuối, điều này có thể gây ra các vấn đề khác.
Sử dụng pcre2grep Thay vào đó (Grep tương thích với Perl)
Thường xuyên grep
không phải là công cụ tốt nhất cho công việc và có một công cụ thay thế được gọi là pcre2grep
gói hỗ trợ cho Biểu thức chính quy Tương thích Perl ngay lập tức và có thể khớp với Regex đa dòng rất dễ dàng.
Nó có thể đã được cài đặt trên hệ thống của bạn, nhưng nếu chưa, bạn có thể tải nó từ trình quản lý gói của mình:
sudo apt install pcre2-utils
Sau đó, bạn chỉ cần chạy nó với -M
tham số.
pcre2grep -M 'from(n|.)*to' file
Lưu ý rằng điều này vẫn yêu cầu bạn phải đối sánh “dòng mới hoặc bất kỳ ký tự nào” theo cách thủ công với (n|.)*
. Ngoài ra, bạn có thể sử dụng (?s)
mẹo để bật PCRE_DOTALL và làm cho ký tự dấu chấm khớp với dòng mới.
pcre2grep -M '(?s)from.*to' file
[ad_2]