Tại sao `grep fil *` thất bại?


9

Tôi thấy echo file|grep fil*thất bại, nhưng echo abcd|grep abc*thành công.

Tôi không hiểu nó, ai đó có thể giải thích?


Bạn có thể thêm hệ thống và phiên bản của grep không? Điều này là do với gnugrep 2.16 (trong Ubuntu 14.04 LTS), nó không tạo ra bất kỳ lỗi nào (mã thoát 0) và nó khớp với ba chữ cái đầu tiên. Ví dụ, echo file|grep fil*câu trả lời với file.
Hastur

3
@Hastur Vấn đề là do mở rộng tên tệp trước biểu thức chính quy. Thư mục làm việc của tôi chứa một tiền tố tệp theo tệp, nhưng không phải là tệp có tiền tố abc, vì vậy tệp * được thay thế bằng tên tệp, nhưng abc * không thay đổi.
tmpbin

Cảm ơn tôi đã không nghĩ về nó. Khi tôi thực hiện những nỗ lực của mình, tôi đã thử chúng trong một thư mục mới ...
Hastur

Câu trả lời:


31

Có hai vấn đề với ví dụ của bạn.

Nguyên tắc cơ bản là bạn cho rằng các biểu thức chính quy hoạt động giống như các mẫu hình cầu trong đó *là ký tự đại diện có nghĩa là "bất kỳ chuỗi ký tự nào". Thay vào đó, trong các biểu thức chính quy, *có nghĩa là "bất kỳ số nào của nguyên tử trước", do đó, fil*có nghĩa là ftheo isau là 0 hoặc nhiều lký tự. Bạn cần nói grep fil.*để có được ý nghĩa dự định: .có nghĩa là "bất kỳ ký tự đơn, vì vậy .*có nghĩa là" bất kỳ chuỗi ký tự nào. "

Vấn đề nhỏ hơn là bạn đang sử dụng các ký tự đặc biệt không được trích dẫn có nghĩa là một cái gì đó theo quy tắc toàn cầu, có nghĩa là vỏ có thể giải thích chúng. Nếu bạn có bất kỳ tệp nào trong thư mục cục bộ khớp với các mẫu toàn cục fil*hoặc abc*, trình bao sẽ mở rộng chúng , do đó grepsẽ lấy các tên tệp được mở rộng dưới dạng mẫu, không phải là RE dự định. Bất cứ khi nào bạn đang sử dụng các ký tự như vậy trên dòng lệnh, bạn nên trích dẫn chúng : echo file | grep 'fil.*'.

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.