ความแตกต่างระหว่างตัวเลือก grep -e และ grep -E คืออะไร?


34

ฉันพยายามที่จะเข้าใจความแตกต่างระหว่างและgrep -e grep -Eตอนนี้จากที่grep manpageฉันได้รับ:

-E, --extended-regexp

ตีความรูปแบบเป็นการแสดงออกปกติเพิ่มเติม (ดูด้านล่าง)

รูปแบบ e - regexp = รูปแบบ

ใช้รูปแบบเป็นลวดลาย มีประโยชน์ในการปกป้องรูปแบบที่ขึ้นต้นด้วย -

คำอธิบายข้างต้นไม่สมเหตุสมผลสำหรับฉัน

ดังนั้นใครสามารถอธิบายให้ฉันใช้examplesสิ่งที่แตกต่างระหว่างสองและเมื่อใช้ตัวเลือกใด

PS: เวอร์ชัน: grep (GNU grep) 2.10



3
วัตถุประสงค์ของการ-eเป็นเพียง disambiguate เมื่อ regex เริ่มต้นด้วยเส้นประ ดังนั้นgrep ---fooให้unrecognized option: ---fooแต่คุณสามารถพูดgrep -e ---fooเพื่อ grep ---fooสำหรับการแสดงออกปกติ
tripleee

คำตอบ:


29

-eเป็นธงเพื่อระบุรูปแบบที่คุณต้องการจับคู่อย่างเคร่งครัด -Eควบคุมว่าคุณต้องหลบหนีอักขระพิเศษบางอย่างหรือไม่

man grepอธิบาย-Eเพิ่มเติมอีกเล็กน้อย:

   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
ดังนั้นนี่คือเหตุผลเมื่อฉันไม่echo "hello" | grep -o -e 'h|l'ได้รับผลลัพธ์เพราะ|สูญเสียความหมายพิเศษและเมื่อecho "hello" | grep -o -E 'h|l'ฉันได้รับผลลัพธ์ที่ต้องการ

2
ใช่. echo "hello" | grep -o -e 'h' -e 'l'จะทำงานถ้าคุณต้องการที่จะโยน-Eออกไปในกรณีนี้
hafichuk

3
grep -e -o 'h|l'จะจับคู่ตัวอักษรh|lในขณะที่grep -e -o 'h\|l'จะจับคู่hหรือlและกับ -E มันตรงกันข้าม
Nahuel Fouilleul

@ronnie มันโชคร้ายที่คุณต้อง 200 + ชื่อเสียงที่จะมี "คุณสมบัติ" ตามคุณระหว่างเว็บไซต์ SE ...
hafichuk

5

นอกจากนี้ยังgrep -eช่วยให้การใช้หลายสายเพื่อการค้นหา: 'grep -e 'abc' -e 'def' -e '123'จะมองหาทั้งสามของสายนี้abcเช่นเดียวกับและdef123

งานนี้ค่อนข้างคล้ายกับgrep 'abc\|def\|123'ที่\|ย่อมาจากorแต่อาจจะค่อนข้างชัดเจนในการอ่าน

เนื่องจากข้อเท็จจริงที่สำคัญที่สุดได้grep -Eถูกอธิบายไว้แล้วที่นี่ฉันแค่ต้องการเพิ่มสิ่งที่ฉันรวมไว้ในหัวข้อนี้ด้วยคำถามที่คล้ายกัน: นิพจน์ทั่วไปสำหรับการค้นหาตัวละครคู่ใน Bash


3

ดูด้านล่าง

/ ขยาย

grep เข้าใจไวยากรณ์นิพจน์ทั่วไปสามเวอร์ชันที่แตกต่างกัน: "พื้นฐาน," "ขยาย" และ "perl" ใน GNU grep ไม่มีความแตกต่างของฟังก์ชันการทำงานที่มีอยู่ระหว่างไวยากรณ์พื้นฐานและขยาย ในการใช้งานอื่นนิพจน์ปกติพื้นฐานมีประสิทธิภาพน้อยกว่า คำอธิบายต่อไปนี้ใช้กับนิพจน์ทั่วไปที่ขยายเพิ่ม ความแตกต่างสำหรับการแสดงผลปกติพื้นฐานจะสรุปหลังจากนั้น การแสดงออกปกติ Perl ให้ฟังก์ชั่นเพิ่มเติมและมีการบันทึกไว้ใน pcresyntax (3) และ pcrepattern (3) แต่อาจไม่สามารถใช้ได้ในทุกระบบ

ดังนั้นอีกครั้ง

ใน GNU grep ไม่มีความแตกต่างในการใช้งานระหว่างการใช้งานพื้นฐานและซินแทกซ์เสริม


2
ฟังก์ชันการทำงานที่เป็นเหมือนกันระหว่างขั้นพื้นฐานและการขยาย แต่ไวยากรณ์แตกต่างกันเล็กน้อย regexp ตัวอักษรพิเศษเช่น(, ), |ฯลฯ จำเป็นต้องทับขวา-หนีไปมีความหมายพิเศษของพวกเขาใน regexp พื้นฐาน แต่ไม่ได้อยู่ในการขยาย (ที่พวกเขาจะต้องหนีไปจะถือว่าเป็นตัวอักษรสตริง)
CAS

1

เพียงเพื่ออธิบายรายละเอียดเกี่ยวกับ-eตัวเลือก -eมักจะเป็นตัวเลือก:

grep PATTERN

เหมือนกันกับ

grep -e PATTERN

นอกจากที่ระบุไว้ในคำตอบก่อนหน้านี้และในหน้าคนมีรูปแบบการค้นหาหลายหรือเพื่อป้องกันรูปแบบที่เริ่มต้นด้วยเครื่องหมายยัติภังค์ (-)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.