Cách tìm các mẫu phù hợp trên nhiều dòng với grep

[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

Cách tìm các mẫu phù hợp trên nhiều dòng với grep

Vẫn có thể xử lý vấn đề này trong greptuy nhiên, lệnh này rất khó hiểu.

grep -Pz '(?s)from.*n.*to' test

Cách tìm các mẫu phù hợp trên nhiều dòng với grep

Đ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 khi tođó 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

Cách tìm các mẫu phù hợp trên nhiều dòng với grep

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]

Chat Zalo
0903064855