Thứ ba, 27/10/2020 | 00:00 GMT+7

Giới thiệu về Cụm từ Thông dụng

Lưu ý: Truy cập hướng dẫn đi kèm này để biết tổng quan chi tiết hơn về cách sử dụng grep và biểu thức chính quy để tìm kiếm các mẫu văn bản trong Linux .


Là administrator hệ thống, nhà phát triển, kỹ sư QA, kỹ sư hỗ trợ, v.v., người ta cần tìm một mẫu cụ thể, chẳng hạn như một tập hợp địa chỉ IP thuộc phạm vi nhất định hoặc phạm vi dấu thời gian hoặc group domain hoặc domain phụ, từ các file . Người ta cũng có thể cần tìm một từ được đánh vần theo một cách cụ thể hoặc tìm lỗi chính tả có thể có trong một file . Đây là nơi xuất hiện các biểu thức chính quy.

Biểu thức chính quy là các mẫu để trùng với các mẫu (hoặc đôi khi không trùng với các mẫu). Chúng cung cấp một cách để mô tả và phân tích cú pháp văn bản. Hướng dẫn này sẽ cung cấp một cái nhìn sâu sắc về biểu thức chính quy mà không đi sâu vào các đặc điểm của bất kỳ ngôn ngữ nào. Ta sẽ chỉ sử dụng egrep để giải thích các khái niệm.

Biểu thức chính quy

Biểu thức chính quy bao gồm hai loại ký tự:

  • các ký tự chữ thông thường và

  • siêu nhân vật

Các siêu ký tự này là những ký tự cung cấp sức mạnh cho các biểu thức chính quy.

Hãy xem xét file country.txt sau trong đó cột đầu tiên là tên quốc gia, cột thứ hai là dân số của quốc gia và cột thứ ba là lục địa.

$ cat country.txt India,1014003817,Asia Italy,57634327,Europe Yemen,1184300,Asia Argentina,36955182,Latin America Brazil,172860370,Latin America Cameroon,15421937,Africa Japan,126549976,Asia 

Anchor Metacharacters

Group đầu tiên của “siêu ký tự” mà ta sẽ thảo luận là ^$ . ^$ lần lượt trùng với phần đầu và phần cuối của một mẫu và được gọi là siêu ký tự cố định .

Để tìm ra tên của tất cả các quốc gia có tên quốc gia bắt đầu bằng I, ta sử dụng biểu thức:

$ egrep '^I' country.txt India,1014003817,Asia Italy,57634327,Europe 

hoặc để tìm ra tất cả các quốc gia có tên lục địa kết thúc bằng e, ta thực hiện:

$ egrep 'e$' country.txt Italy,57634327,Europe 

Siêu ký tự tiếp theo là dấu chấm (.), Trùng với bất kỳ ký tự nào . Để trùng với tất cả các dòng trong đó tên quốc gia dài đúng 5 ký tự:

$ egrep '^.....,' country.txt India,1014003817,Asia Italy,57634327,Europe Yemen,1184300,Asia Japan,126549976,Asia 

Làm thế nào về việc tìm tất cả các dòng trong đó tên quốc gia bắt đầu bằng I hoặc J và tên quốc gia dài 5 ký tự?

$ egrep '^[IJ]....,' country.txt India,1014003817,Asia Italy,57634327,Europe Japan,126549976,Asia 

[…] Được gọi là một tập ký tự hoặc một lớp ký tự . Bên trong một bộ ký tự, chỉ một trong các ký tự đã cho được khớp.

Dấu ^ bên trong bộ ký tự phủ định bộ ký tự. Ví dụ sau sẽ trùng với tên quốc gia dài năm ký tự nhưng không bắt đầu bằng I hoặc J.

$ egrep '^[^IJ]....,' country.txt Yemen,1184300,Asia 

Siêu ký tự group và sự thay thế

Để trùng với tất cả dòng có chứa Châu Á hoặc Châu Phi:

$ egrep 'Asia|Africa' country.txt India,1014003817,Asia Yemen,1184300,Asia Cameroon,15421937,Africa Japan,126549976,Asia 

Điều này cũng có thể được thực hiện bằng cách lấy Amột chung.

$ egrep 'A(si|fric)a' country.txt India,1014003817,Asia Yemen,1184300,Asia Cameroon,15421937,Africa Japan,126549976,Asia 

Bộ định lượng

Thay vì viết

$ egrep '^[IJ]....,' country.txt 

ta có thể viết

$ egrep '^[IJ].{4},' country.txt 

trong đó {} được gọi là bộ định lượng . Họ xác định số lần ký tự trước khi chúng xuất hiện.

Ta cũng có thể đưa ra một phạm vi:

$ egrep '^[IJ].{4,6},' country.txt India,1014003817,Asia Italy,57634327,Europe Japan,126549976,Asia 

Điều này sẽ trùng với tên quốc gia bắt đầu bằng I hoặc J và có 4 đến 6 ký tự sau nó.

Có một số phím tắt có sẵn cho các bộ định lượng. Ví dụ,

{0,1} tương đương với?

$ egrep '^ab{0,1}c$' filename 

giống như

$ egrep '^ab?c' filename 

{0,} tương đương với *

$ egrep '^ab{0,}c$' filename 

giống như

$ egrep '^ab*c' filename 

{1,} tương đương với +

$ egrep '^ab{1,}c$' filename 

giống như

$ egrep '^ab+c' filename 

Hãy để ta xem một số ví dụ liên quan đến các biểu thức mà ta đã thấy cho đến nay. Ở đây thay vì tìm kiếm từ một file , ta tìm kiếm từ đầu vào chuẩn. Thủ thuật ta sử dụng là ta biết grep (hoặc egrep) tìm kiếm một mẫu và nếu một mẫu được tìm thấy, thì toàn bộ dòng chứa mẫu sẽ được hiển thị.

Ta muốn tìm ra tất cả các cách có thể để đánh vần câu mà bộ đồ màu xám là yêu thích của anh ấy .

Biểu thức sẽ là:

$ egrep 'the gr[ea]y colou?r suit was his favou?rite' the grey color suit was his favourite the grey color suit was his favourite  the gray colour suit was his favorite the gray colour suit was his favorite 

Nhìn vào biểu thức trên, ta có thể thấy rằng:

  • màu xám có thể được đánh vần là xám hoặc xám

  • color có thể được viết là color hoặc color, nghĩa là u là tùy chọn nên ta sử dụng u?

  • yêu thích hoặc yêu thích tương tự có thể được viết yêu thích? nghi thức

Làm thế nào về việc trùng với mã zip của USA ?

$ egrep '^[0-9]{5}(-[0-9]{4})?$' 83456 83456  83456-  834562  92456-1234 92456-1234  10344-2342-345 

Thêm một ví dụ về việc khớp tất cả thời gian hợp lệ trong đồng hồ 24 giờ.

$ egrep '^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]' 23:44:02 23:44:02  33:45:11  15:45:33 15:45:33 

Trong ví dụ trên, ta đã nói rằng, nếu chữ số đầu tiên của giờ là 0 hoặc 1, thì chữ số thứ hai sẽ
là bất kỳ từ 0 đến 9. Nhưng nếu chữ số đầu tiên là 2, thì các giá trị được phép cho chữ số thứ hai là 0,1, 2 hoặc 3.

Ranh giới từ

Để viết một mẫu để khớp các từ kết thúc bằng màu như màu đơn, màu nước, màu nhiều màu, v.v.
được kết hợp nhưng không phải không màu hoặc nhiều màu Hãy tự mình thử các ví dụ sau để làm quen với chúng:

$ egrep 'color\>' 

Tiếp theo, để kết hợp không màu và nhiều màu, nhưng không phải màu đơn, màu nước, nhiều màu, v.v.

$ egrep '\<color' 

Do đó để trùng với màu từ chính xác, ta thực hiện:

$ egrep '\<color\>' 

Tài liệu tham khảo

Giả sử ta muốn đối sánh tất cả các từ được gõ kép, giống như từ trước đó hoặc trước đó , ta phải sử dụng tham chiếu ngược. Backreferences được sử dụng để ghi nhớ các mẫu.

Đây là một ví dụ:

$ egrep "\<the\> \1" 

Hoặc cách chung chung:

$ egrep "\<(.*)\> \1" 

Ví dụ trên được dùng để tìm tất cả các tên mà họ và tên giống nhau. Trong trường hợp có nhiều hơn một tập hợp các dấu ngoặc đơn, thì phần thứ hai, thứ ba thứ tư, v.v. có thể được tham chiếu với \ 2, \ 3, \ 4, v.v.

Đây chỉ là phần giới thiệu về sức mạnh của biểu thức chính quy.


Tags:

Các tin trước