Tại sao \ d metacharacter không hoạt động trong lệnh find với -regextype posix-egrep hoạt động?


2

Tôi có một danh sách các tệp .jpg trong thư mục hiện tại của mình với các đường dẫn sau:

./ex.jpg
./ex1234.jpg
./ex4321.jpg

tôi đang cố gắng chỉ khớp những số có chứa các số có biểu thức chính quy và findlệnh. Đây là lệnh tôi đang chạy:

find . -regextype posix-egrep -regex "\.\/ex\d+\.jpg"

Tuy nhiên, điều này sẽ không phù hợp với bất cứ điều gì trong thư mục của tôi. Và thậm chí xa lạ là thực tế là lệnh sau (thay thế \d+bằng \d*):

find . -regextype posix-egrep -regex "\.\/ex\d*\.jpg"

chỉ xuất ra điều này:

./ex.jpg

Tôi đã thử biểu thức chính quy này thay đổi -regextypelệnh thành tất cả các tùy chọn khác có sẵn nhưng điều này dường như không tạo ra bất kỳ tác động nào.

Ai đó có thể giải thích hành vi này?

Phiên bản của tôi về find: (GNU findutils) 4.7.0-git trong Ubuntu 16.04.3 LTS cho Hệ thống con Windows cho Linux.

Câu trả lời:


3

\d (đối với chữ số thập phân) không được hỗ trợ bởi cú pháp biểu thức chính quy (ERE) mở rộng POSIX (hoặc GNU grep) - như bạn có thể xác nhận dễ dàng:

$ echo 'foo1234bar' | grep -E '\d'

Thực tế \dxuất phát từ perlđược GNU grep hỗ trợ trong chế độ PCRE (biểu thức chính quy tương thích perl):

$ echo 'foo1234bar' | grep -P '\d'
foo1234bar

Tuy nhiên, điều đó không giúp được gì nhiều findvì AFAIK chưa cung cấp PCRE regextype- bạn sẽ phải sử dụng phạm vi ký tự đơn giản [0-9], được hỗ trợ bởi cả ERE và các biểu thức chính quy cơ bản (BRE):

find . -regextype posix-egrep -regex "\.\/ex[0-9]+\.jpg"

Lý do \d*\.jpgphù hợp ex.jpglà bởi vì \dđược coi là nghĩa đen d- và không hoặc nhiều hơn bất cứ thứ gì phù hợp với mọi thứ.

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.