3.1 Biểu thức chính quy
25
3.1.7
Sử dụng [ˆ]
Bạn có thể đảo ngược ý nghĩa của dấu ngoặc vuông bằng cách đặt một \^{} ngay sau [.
Trong trường hợp này, dấu ngoặc đơn sẽ tìm tương ứng bất kỳ ký tự nào mà không được liệt
kê trong chúng. Nhắc lại lần nữa, chú ý rằng chúng ta dùng [\^{}] với biểu thức chính
quy, nhưng [!] với "glob":
$ grep dev.hda[^{}12] /etc/fstab
/dev/hda3
/
reiserfs noatime,ro 1 1
#/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1
3.1.8
Cú pháp khác
Cần biết rằng cú pháp bên trong ngoặc vuông khác cơ bản với những phần khác của biểu
thức chính quy. Ví dụ, nếu bạn đặt một . bên trong ngoặc vuông, nó cho phép ngoặc vuông
tìm tương ứng một ký tự thường ., giống như 1 và 2 trong ví dụ trên. Để so sánh, một ký tự .
ngoài ngoặc vuông được biên dịch như một ký tự mêta trừ khi đặt sau một $\backslash$.
Chúng ta có thể lợi dụng điều này để in ra danh sách tất cả những dòng trong /etc/fstab mà
chứa dòng văn bản dev.hda bằng cách gõ:
$ grep dev[.]hda /etc/fstab
Một cách tương tự, có thể gõ:
$ grep "dev\.hda" /etc/fstab}
Có thể không biểu thức chính quy nào tìm thấy tương ứng trong /etc/fstab của bạn.
3.1.9
Ký tự mêta "*"
Một vài ký tự mêta tự chúng không tương ứng với bất kỳ thứ gì, nhưng thay đổi ý nghĩa của
ký tự đứng trước. Một ký tự mêta như vậy là * (dấu sao), mà được sử dụng để tìm tương ứng
không (0) hay nhiều lần lặp lại của ký tự đứng trước. Lưu ý điều đó có nghĩa rằng * có một
ý nghĩa khác trong regex so với trong glob. Đây là một số ví dụ, và cần quan tâm tới những
trường hợp cá biệt khi regex khác với glob:
• ab*c tương ứng abbbbc nhưng không tương ứng abqc (Nếu là glob, nó sẽ tương
ứng cả hai chuỗi – bạn có thể đoán ra tại sao không?)
• ab*c tương ứng abc nhưng không tương ứng abbqbbc (nhắc lại, nếu một glob, nó
sẽ tương ứng cả hai)
• ab*c tương ứng ac nhưng không tương ứng cba (nếu một glob, nó sẽ không tương
ứng cả ac và ba|)
• b[cq]*e tương ứng bqe và be (nếu một glob, nó sẽ tương ứng bqe nhưng be thì
không)