Phần trước chúng ta đã đề cập đến một số cú pháp cơ bản của biểu thức chính quy, trong phần tiếp theo này, chúng ta sẽ xét thêm một số ví dụ cơ bản khác và sau đó sẽ đề cập đến một số ứng dụng cơ bản trong việc xây dựng mẫu lọc cho Egrep.
Liệt kê một số biểu thức:
Word boundaries | ||
| \b | khớp tại các vị trí nằm giữa một ký tự word (là ký tự khớp với \w) và một ký tự không phải word (khớp với \W hoặc [\w]), kể cả vị trí bắt đầu hoặc kết thúc chuỗi nếu các vị trí đó là ký tự word | .\b khớp g trong cuong .\b sẽ khớp e và u trong love\tyou |
| \B | Khớp tại vị trí nằm giữa 2 ký tự word hoặc các vị trí năm giữa 2 ký tự không phải word. | \B.\B khớp với v,n,x trong _vnu(x) |
Sự lựa chọn | ||
| | (pipe) | lựa chọn giữa 2 thành phần bên trái hoặc bên phải dấu | | Abc | def khớp với Abc hoặc def abc(def | xyz) khớp với abcdef hoặc abcxyz |
Định lượng | ||
| ? (question mark) | có xuất hiện hoặc không | Abc? khớp với Ab hoặc Abc |
| * (star) | xuất hiện 0 hoặc nhiều lần | _.* khớp với _count trong if _count > 1 |
| + (plus) | xuất hiện 1 hoặc nhiều lần. | (ab)+ khớp với lab trong this is a lab. |
| {n} với n >=1, n nguyên | xuất hiện chính xác n lần | r{2} khớp với blackberry trong This is a blackberry phone. |
| {min, max} với min, max nguyên dương, max >= min | xuất hiện ít nhất min lần, nhiều nhất max lần | Ww{2,4} khớp với Www, Wwww, Wwwww |
| {min,} | Xuất hiện tối thiểu min lần | Ww{2,} khớp với Www, Wwww, … |
Egrep là viết tắt của "Extended Global Regular Expressions Print", cùng với các tiện ích lọc như grep, fgrep, rgrep,... tạo nên một bộ filter rất thông dụng của *NIX. Các tiện ích này có chung chức năng chính là lọc từng dòng trong một file chỉ định để tìm ra dòng nào chứa mẫu tìm kiếm. Ngoài cách gọi tường minh egrep, bạn cũng có thể dùng grep -e .
Sau đây chúng ta cùng điểm qua một vài điểm cần lưu ý riêng cho filter này :
| ký hiệu | ý nghĩa |
| C | ký tự C thông thường |
| \c | escape ký tự c nếu c là ký tự đặc biệt |
| ^ | đánh dấu đầu dòng |
| $ | đánh dấu cuối dòng |
| . * + ? | như đã đề cập trong phần biểu thức chính quy |
| (a) | với a là một biểu thức |
| \n (n là số nguyên dương) | tham chiếu tới xâu con được mô tả trong cặp ngoặc đơn thứ n tính từ đầu biểu thức chính quy |
Ví dụ minh họa :
- Bắt đầu bằng ký tự a sau đó là bất kỳ ký tự nào
egrep “( |^)a.*” filename;
- Bắt đầu bằng hoặc ký tự a, ký tự b hoặc c, sau đó là bất kỳ ký tự nào.
egrep “( |^)[abc].*” filename
- Không bắt đầu bằng ký tự a, b và c, sau đó có thể là bất kỳ ký tự nào
egrep ‘( |^)[^abc].*’ filename
- Đầu dòng là ký tự a, sau đó là bất kỳ ký tự nào
grep “^a.*” filename
- Toàn là ký tự a
egrep “( |^)aa*( |$)” filename
- Tìm các từ bắt đầu bằng chữ a, sau đó là một hoặc 3 chữ c và kết thúc bằng chữ d
egrep “( |^)a(c|ccc)[^c]*d( |$)” filename
- Tìm kiếm các địa chỉ email xuất hiện trong nội dung của văn bản. Địa chỉ email thường có định dạng: username@domain.country, trong đó domain có thể có nhiều cấp (ví dụ: mail.vnu.edu, cũng có thể chỉ có 1 cấp như microsoft; country là mã đại diện cho tên nước hay một địa chỉ cấp 1 nào đó chẳng hạn như vn, kr, th, sg, com, net,…
egrep “( |^)[a-zA-Z]+[a-zA-Z0-9]*@([a-z0-9]+.){1,}[a-z]+( |$)” filename
- Tìm kiếm các địa chỉ MAC của card mạng máy tính trong văn bản (ví dụ về một địa chỉ MAC là 00-1F-29-8D-98-39)
egrep “( |^)([0-9A-F]{2,2}-){5,5}[0-9A-F]{2,2}( |$)” filename
- Tìm kiếm các số điện thoại di động của Viettel xuất hiện trong văn bản
Mẫu:
098/097/0168/0169/0166x.xxx.xxx
Ghi chú: ứng với mỗi mẫu sẽ cần cho thêm một biểu thức chính quy
egrep “( |^)(097|098|0166|0168|0169)[0-9](\.[0-9]{3,3}){2,2}( |$)” filename
- Tìm kiếm tất cả các ngày (viết dưới dạng các ký số, ví dụ 30/12/09) xuất hiện trong văn bản
egrep “( |^)([0-9]{2,2}/){2,2}[0-9]{2,2}( |$)” filename
- Tìm kiếm tất cả các biểu thức thời gian (viết dưới dạng các ký số, ví dụ 10:30) xuất hiện trong văn bản
egrep “( |^)[0-9]{2,2}:[0-9]{2,2}” filename
- Tìm kiếm các URL xuất hiện trong văn bản
egrep “( |^)(http|ftp)://([a-z0-9]+\.){1,}[a-z]+( |$)” filename
- Tìm kiếm các địa chỉ IP xuất hiện trong văn bản
- Tìm kiếm danh sách các thẻ HTML xuất hiện trong văn bản
egrep “()|()|()” filename
No comments:
Post a Comment