Các sự cố với các tính năng nâng cao trong -regex của tiện ích


0

Ví dụ: điều này không tìm thấy tệp:

: > 12; basename $(find -E . -regex '^(.*)(\d{2})' -print 2>/dev/null)

Nhưng điều này không:

basename $(find -E . -regex '^(.*)([0-9]{2})' -print 2>/dev/null)

Đồng thời, ví dụ:

echo -e '12\nabc\n456' | grep -E -e '^(\d{3})'

hoạt động khá tốt, mặc dù dường như sử dụng như nhau regcomp().

Tôi đang làm gì sai và làm cách nào để khắc phục?


1
OS X mới hơn grep sử dụng một BSD mã cơ sở, không GNU grep. Các -E tùy chọn là một mosh của POSIX ERE and PCRE và tôi tin độc quyền cho OS X. find sử dụng BREERE\d lớp nhân vật không hợp lệ.
fd0

@ fd0 Nhận xét tốt nhất!
cave-canem

Câu trả lời:


1

Dường như có một lỗi trong MacOS bản địa tìm thấy trong đó -regex tùy chọn không xử lý chính xác bất kỳ Phím tắt nào được mô tả trong man re_format. Lệnh sau dường như hoạt động:

find -E . -regex '^(.*)([[:digit:]]{2})' -print

Biến thể hơi đơn giản này dường như cũng hoạt động:

find -E . -regex '.*[[:digit:]]{2}' -print

Nói ngắn gọn, grep -Efind S -regex tùy chọn dường như không xử lý các biểu thức chính quy theo cùng một cách.


@Erik Fuller, tôi nghĩ đó là về một cái gì đó khác biệt, cũng như gfind . -regextype 'egrep' -regex '^(.*)(\d{2})' -print 2>/dev/null không hoạt động
cave-canem

Nó có thể có gfind có cùng một lỗi. Trong mọi trường hợp dường như có một cách giải quyết khả thi.
Eirik Fuller

vấn đề là loại bỏ toàn bộ "REs mở rộng cơ bản và nâng cao". Trong trường hợp này không rõ tại sao "egrep" hoạt động tốt, bởi vì nó cũng sử dụng tương tự regcomp ()
cave-canem

Nó loại bỏ một số RE mở rộng, nhưng không phải tất cả chúng; các [[:digit:]] cấu trúc được mô tả trong câu trả lời này dường như không hoạt động trong find không có -E.
Eirik Fuller

Không phải RE mở rộng, nhưng "REs mở rộng cơ bản và nâng cao"
cave-canem

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.