Câu trả lời:
Biểu thức thông thường và tên tập tin toàn cầu là hai điều rất khác nhau.
Biểu thức chính quy được sử dụng trong các lệnh / hàm để khớp mẫu trong văn bản. Ví dụ trong tham số mẫu của grep
hoặc trong các ngôn ngữ lập trình.
Tên tập tin toàn cầu được sử dụng bởi shell để khớp tên tập tin và thư mục bằng cách sử dụng ký tự đại diện. Các khả năng của Globing phụ thuộc vào vỏ. Bash, ví dụ, hỗ trợ các ký tự đại diện như:
*
khớp 0 ký tự trở lên?
khớp 1 ký tự[...]
phù hợp với một nhân vật trong bộ được chỉ địnhCác ký tự đại diện này có thể trông tương tự như các biểu thức thông thường, thực sự [...]
có cùng ý nghĩa trong Globing và regex. Nhưng *
và ?
có nghĩa là những điều khác nhau trong Globing và regex.
Trong một bình luận bạn đã viết:
nhưng làm thế nào người phiên dịch khác biệt * cho dù đó là một người pha trò hay regex? ví dụ :
grep a*b a*.txt
?
Dễ dàng. Sắp xếp
Trước hết, shell cố gắng diễn giải các ký tự đại diện, bằng cách ghép chúng với tên tệp. Nếu có các tệp bắt đầu bằng "a" và kết thúc bằng "b", shell sẽ thay thế a*b
bằng tên tệp phù hợp. Cùng đi cho a*.txt
. Nếu không có tên tệp phù hợp, shell sẽ chuyển các đối số grep
theo đúng nghĩa đen.
Tuy nhiên, tham số đầu tiên grep
phải là một mẫu. Trong 99.999% trường hợp sử dụng thực tế, bạn không muốn tham số đầu tiên được giải thích bởi trình bao. Vì vậy, rất có thể ý định là thế này:
grep "a*b" a*.txt
Nhờ trích dẫn a*b
, shell sẽ không diễn giải nó bằng cách sử dụng Globing, và thay vào đó chuyển trực tiếp đến grep
. Đổi lại, grep
sẽ giải thích rằng như là một biểu thức thông thường (theo thiết kế).
Để tóm tắt, shell diễn giải dòng lệnh theo ngôn ngữ toàn cầu của chính nó, đó là sử dụng các ký tự đại diện. Các lệnh, chương trình diễn giải các tham số của chúng theo bất kỳ cách nào chúng được thiết kế bởi tác giả của chúng.
Nếu tên tệp là một chuỗi cho bạn, bạn cũng có thể sử dụng regex cho tên tệp. Ví dụ: nếu bạn muốn tìm tên tệp khớp với biểu thức chính quy, bạn có thể thử:
find ./ -regex '.*[abc][xyz].*'
Lệnh tìm kiếm các tệp có a, b hoặc c trong tên theo sau là x, y hoặc z. Đây chỉ là một ví dụ. Có những khả năng vô tận.
find ./ -name 'a*'
bạn sử dụng * như một ký tự đại diện. Khi bạn gõ find ./ -regex 'a*'
, bạn sử dụng * trong regex. Sự khác biệt quan trọng là chuyển đổi -name
hoặc -regex
.