Vấn đề regex của Grep 'OR'


65

Tôi đang cố gắng sử dụng grep với regex để tìm các dòng trong tệp khớp với 1 trong 2 chuỗi có thể. Đây là grep của tôi:

$ grep "^ID.*(ETS|FBS)" my_file.txt

Các grep trên trả về không có kết quả. Tuy nhiên nếu tôi thực hiện một trong hai:

$ grep "^ID.*ETS" my_file.txt  

hoặc là

$ grep "^ID.*FBS" my_file.txt  

Tôi phù hợp với dòng cụ thể. Tại sao regex OR của tôi không khớp? Xin được cảm ơn trước về sự giúp đỡ!

Câu trả lời:


94

Với regex bình thường, các nhân vật (, |)cần phải được trốn thoát. Vì vậy, bạn nên sử dụng

$ grep "^ID.*\(ETS\|FBS\)" my_file.txt

Bạn không cần các lối thoát khi bạn sử dụng tùy chọn regex ( -E) mở rộng . Xem man grep, phần " Basic vs Extended Regular Expressions".


10
Bạn cũng có thể sử dụng egrepthay vì grep -E.
Riccardo Murri

2
@RiccardoMurri Câu trả lời của Michal nói rằng egrep (và fgrep) không được chấp nhận (mặc dù chúng vẫn có thể hoạt động).
Timo

27

Nếu bạn muốn sử dụng nhiều nhánh ( |như or), để tương thích hơn, tốt hơn là nói rõ ràng bạn muốn sử dụng "RE hiện đại" aka. ERE.

Để làm như vậy, sử dụng grep -E :

grep -E "^ID.*(ETS|FBS)" my_file.txt

Để tìm hiểu thêm về RE, ERE và toàn bộ câu chuyện ER "hiện đại", hãy xem man 7 regex.

Ngoài ra, bạn có thể sử dụng egrepthay vì grep, nhưng như bạn có thể đọc từ man grep:

egrep giống như grep -E. fgrep giống như grep -F

(...)

Gọi trực tiếp hoặc egrep hoặc fgrep đang bị phản đối


Trong khi việc gọi egrep trực tiếp không được chấp nhận, nó sẽ hoạt động trong hầu hết các biến thể * nix.
Đánh dấu
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.