Làm thế nào để các biểu thức thông thường khác với các ký tự đại diện được sử dụng để lọc các tệp


15

Mặc dù chúng tôi sử dụng *để biểu thị 0 hoặc nhiều ký tự trước đó grep, chúng tôi sử dụng *.cđể tìm tất cả các tệp C khi chúng tôi sử dụng nó với lslệnh như thế nào ls *.c. Ai đó có thể cho biết việc sử dụng *khác nhau như thế nào trong hai trường hợp này?

Câu trả lời:


30

Tên tập tin Shellbiểu thức chính quy sử dụng một số ký tự giống nhau và chúng có cùng mục đích, nhưng bạn nói đúng, chúng không tương thích. Tên tập tin Globing là một hệ thống ít mạnh mẽ hơn nhiều.

Trong tên tập tin globalbing:

  • * có nghĩa là "không hoặc nhiều ký tự"

  • ? có nghĩa là "bất kỳ ký tự đơn"

Nhưng trong regexes, bạn phải sử dụng .*có nghĩa là "không hoặc nhiều ký tự" và .có nghĩa là "bất kỳ ký tự đơn lẻ nào". A ?có nghĩa là một cái gì đó khá khác nhau trong regexes: zero hoặc một thể hiện của phần tử RE trước đó.

Dấu ngoặc vuông ( []) dường như hoạt động giống nhau trong cả hai hệ thống trên hệ thống Tôi đang gõ cái này trên, đối với các trường hợp đơn giản ít nhất. Điều này bao gồm những thứ như các lớp ký tự POSIX (ví dụ [:alpha:]). Điều đó nói rằng, nếu bạn cần các lệnh của mình để hoạt động trên nhiều loại hệ thống khác nhau, tôi khuyên bạn không nên sử dụng bất cứ thứ gì ngoài những thứ cơ bản như danh sách các ký tự (ví dụ:[abeq] ) và có thể các phạm vi ký tự (ví dụ [a-c]).

Những khác biệt này có nghĩa là hai hệ thống chỉ có thể thay thế trực tiếp cho các trường hợp đơn giản. Nếu bạn cần kết hợp regex của tên tệp, bạn cần thực hiện theo cách khác. find -regexlà một lựa chọn. (Lưu ý rằng nhân tiện cũng find -namesử dụng cú pháp toàn cầu.)


2
Tôi không biết nó được gọi là
globalbing

3
Ngoài ra, có nhiều hương vị khác nhau của regex. Không phải tất cả các regex được tạo ra như nhau! Và bạn có nhiều hệ thống mô hình phù hợp khác, chẳng hạn như SQL như , nơi '%'phương tiện '*'.
Ông Lister

4
Hai hương vị chính của regrec là POSIX và PCRE (Perl Tương thích RE). Càng về sau càng ít dài và có một số tính năng hơn. Các công cụ và shell của Unix thường sử dụng POSIX, hầu hết các ngôn ngữ lập trình có regexps tích hợp (trừ shell) đều sử dụng PCRE. Chỉ cần cẩn thận sự khác biệt khi bạn đang đọc tài liệu trực tuyến.
goldilocks

11

Trả lời cho câu hỏi thể hiện trong tiêu đề ban đầu:

Tại sao các biểu thức chính quy khác với biểu thức được sử dụng để lọc các tệp?

Mở rộng tên tệp có trước các biểu thức chính quy, đã tồn tại với hầu hết các hệ điều hành (ký tự đại diện / ký tự joker) và đơn giản và trực quan hơn nhiều so với các biểu thức sau.

Mặc dù *.txtcó thể dễ hiểu bởi người dùng thông thường, tương tự .*\.txtlà thứ được nhắm mục tiêu nhiều hơn cho người dùng / lập trình viên có kinh nghiệm, chưa kể ^.*\.txt$...


2
Một lý do khác cho một phần tại sao một phần: tốc độ. Biểu thức thông thường chậm hơn: pastebin.com/3iNCgkE3
manatwork

3
*.txt không bằng .*\.txt , nó (hầu hết) bằng .*\.txt$vì không thể có gì sau .txt(ít nhất là giả sử tên tập tin hợp lý ). Có lẽ thậm chí ^.*\.txt$phần nào tùy thuộc vào cách sử dụng. Chứng minh quan điểm của bạn?
một CVn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.