Sự khác biệt giữa tùy chọn grep -e và grep -E là gì?


34

Tôi đang cố gắng để hiểu sự khác biệt giữa grep -egrep -E. Bây giờ từ grep manpagetôi đã nhận:

-E, --extends-regrec

Giải thích MẪU như một biểu thức chính quy mở rộng (xem bên dưới).

-e MẪU, --regrec = MẪU

Sử dụng MẪU làm mẫu; hữu ích để bảo vệ các mẫu bắt đầu bằng -

Những lời giải thích trên không có ý nghĩa đối với tôi.

Vì vậy, ai đó có thể giải thích cho tôi bằng cách sử dụng examplessự khác biệt giữa hai và khi nào nên sử dụng tùy chọn nào.

PS: Phiên bản: grep (GNU grep) 2.10



3
Mục đích của -ethực sự chỉ là để định hướng khi regex bắt đầu bằng dấu gạch ngang. Vì vậy, grep ---foocho unrecognized option: ---foonhưng bạn có thể nói grep -e ---foovới grep cho biểu thức thông thường ---foo.
tripleee

Câu trả lời:


29

-eđúng là cờ cho biết mẫu bạn muốn khớp với. -Ekiểm soát xem bạn cần phải thoát một số ký tự đặc biệt.

man grepgiải thích -Ethêm một chút:

   Basic vs Extended Regular Expressions
   In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \).

   Traditional  egrep  did  not  support  the  {  meta-character, and some egrep implementations support \{ instead, so portable scripts should avoid { in grep -E patterns and should use [{] to match a
   literal {.

   GNU grep -E attempts to support traditional usage by assuming that { is not special if it would be the start of an invalid interval specification.  For example, the command grep -E '{1' searches for
   the two-character string {1 instead of reporting a syntax error in the regular expression.  POSIX.2 allows this behavior as an extension, but portable scripts should avoid it.

2
Vì vậy, đây là lý do khi tôi không echo "hello" | grep -o -e 'h|l'nhận được đầu ra vì |mất ý nghĩa đặc biệt và khi echo "hello" | grep -o -E 'h|l'tôi nhận được đầu ra mong muốn.

2
Vâng. echo "hello" | grep -o -e 'h' -e 'l'sẽ hoạt động nếu bạn muốn ném -Eđi trong trường hợp này.
hafichuk

3
grep -e -o 'h|l'sẽ khớp theo nghĩa đen h|ltrong khi grep -e -o 'h\|l'sẽ khớp hhoặc lvà với -E thì ngược lại
Nahuel Fouilleul

@ronnie Thật không may, bạn cần hơn 200 danh tiếng để có "tính năng" đó theo bạn giữa các trang web SE ...
hafichuk

5

Cũng grep -echo phép sử dụng một số chuỗi để tìm kiếm: 'grep -e 'abc' -e 'def' -e '123'sẽ tìm kiếm cả ba chuỗi này: abccũng như def123.

Điều này hoạt động khá giống với grep 'abc\|def\|123'nơi \|đại diện cho ornhưng có thể rõ ràng hơn một chút để đọc.

Vì các sự kiện quan trọng nhất grep -Eđã được giải thích ở đây, tôi chỉ muốn thêm những gì tôi đã tóm tắt về chủ đề này vào một câu hỏi khá giống nhau: Biểu thức chính quy để tìm các ký tự kép trong Bash


3

xem bên dưới

/ mở rộng

grep hiểu ba phiên bản khác nhau của cú pháp biểu thức chính quy: cơ bản, thời gian mở rộng, và cơ sở dữ liệu, trong phần mềm GNU, không có sự khác biệt về chức năng có sẵn giữa các cú pháp cơ bản và cú pháp mở rộng. Trong các triển khai khác, các biểu thức chính quy cơ bản ít mạnh hơn. Mô tả sau đây áp dụng cho các biểu thức chính quy mở rộng; sự khác biệt cho các biểu thức chính quy cơ bản được tóm tắt sau đó. Các biểu thức chính quy Perl cung cấp chức năng bổ sung và được ghi lại trong pcresyntax (3) và pcrepotype (3), nhưng có thể không có sẵn trên mọi hệ thống.

Vì vậy, một lần nữa.

Trong GNU grep, không có sự khác biệt về chức năng có sẵn giữa các cú pháp cơ bản và mở rộng


2
các chức năng là như nhau giữa cơ bản và mở rộng nhưng cú pháp là hơi khác nhau. RegExp ký tự đặc biệt như (, ), |vv cần phải dấu chéo ngược thoát có ý nghĩa đặc biệt của họ trong regexp cơ bản, nhưng không phải trong mở rộng (nơi họ cần phải được thoát được đối xử như một literal string)
cas

1

Chỉ để xây dựng trên các -etùy chọn. -ethường là tùy chọn:

grep PATTERN

giống hệt với

grep -e PATTERN

trừ khi, như đã nêu trong một Câu trả lời trước đó và trong các trang hướng dẫn, có nhiều mẫu tìm kiếm hoặc để bảo vệ một mẫu bắt đầu bằng dấu gạch nối (-).

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.