Grep -e ve grep -E seçeneği arasındaki fark nedir?


34

Ben arasındaki farkı anlamaya çalışıyorum grep -eve grep -E. Şimdi grep manpageanladım:

-E, - genişletilmiş-regexp

DESEN'i genişletilmiş düzenli ifade olarak yorumla (aşağıya bakınız).

-e DESEN, --regexp = DESEN

Desen olarak PATTERN kullanın; ile başlayan kalıpları korumak için yararlıdır -

Yukarıdaki açıklama benim için anlamlı değil.

Peki, biri bana examplesikisi arasındaki farkın ne olduğunu ve ne zaman kullanılacağını kullanarak açıklayabilir .

PS: Sürüm: grep (GNU grep) 2.10



3
Amacı, -esadece bir regex bir tire ile başladığında gerçekten küçümsemek etmektir. Yani grep ---fooverir, unrecognized option: ---fooancak grep -e ---foodüzenli ifade için grep diyebilirsiniz ---foo.
üçlü

Yanıtlar:


29

-eKarşılaşmak istediğiniz kalıbı belirten bayraktır. -Ebelirli özel karakterlerden kaçmanız gerekip gerekmediğini kontrol eder.

man grep-Ebiraz daha açıklar :

   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
bu yüzden bu neden echo "hello" | grep -o -e 'h|l'çıktı alamıyorum çünkü |özel anlamını yitiriyorum ve ne zaman echo "hello" | grep -o -E 'h|l'istediğim çıktıyı alıyorum.

2
Evet. Bu durumda uzaklaşmak echo "hello" | grep -o -e 'h' -e 'l'istersen işe yarar -E.
hafichuk 10:12

3
grep -e -o 'h|l'anlamıyla maç olacak h|liken grep -e -o 'h\|l'maç olacak hya lve -E ile o aykırıdır
Nahuel FOUILLEUL

@ronnie, bu "özelliğin" SE siteleri arasında sizi takip etmesi için 200'den fazla itibara ihtiyacınız olması talihsizdir ...
hafichuk

5

Ayrıca grep -e: arama için birkaç dizeleri kullanmanıza olanak sağlar 'grep -e 'abc' -e 'def' -e '123'Bu dizeleri üçü için de bakacağız: abcyanı sıra defve 123.

Bu, grep 'abc\|def\|123'nerede \|durduğuna benzer şekilde çalışır orancak okunması biraz daha net olabilir.

En önemli gerçekler grep -Eburada açıklandığı gibi, ben de bu konu hakkında özetlediklerimi oldukça benzer bir soruya eklemek istiyorum: Bash'de çift karakter bulmak için Düzenli İfade


3

aşağıya bakınız

/Genişletilmiş

grep, normal ifade sözdiziminin üç farklı versiyonunu anlar: “temel”, “genişletilmiş” ve “perl.” Diğer uygulamalarda, temel düzenli ifadeler daha az güçlüdür. Aşağıdaki açıklama genişletilmiş düzenli ifadeler için geçerlidir; Temel düzenli ifadelerin farklılıkları daha sonra özetlenir. Perl düzenli ifadeleri ek işlevsellik sağlar ve pcresyntax (3) ve pcrepattern (3) belgesinde belgelenmiştir, ancak her sistemde bulunmayabilir.

Yani bir kez daha.

GNU grep'te, temel ve genişletilmiş sözdizimleri arasında kullanılabilir işlevsellik açısından bir fark yoktur.


2
işlevsellik , temel ve genişletilmiş arasında aynı olduğu, ancak yapı biraz daha farklıdır. gibi özel karakter Regexp'i (, ), |vb ters eğik çizgi bulunan temel regexp onların özel bir anlamı var, ama (onlar dize olarak tedavi edilmesi kaçmış olması gerektiğini) genişletilmiş olması gerek
cas

1

Sadece -eseçenek üzerinde yoğunlaşmak için . -egenellikle isteğe bağlıdır:

grep PATTERN

özdeştir

grep -e PATTERN

Daha önce bir Cevapta ve man sayfalarında belirtildiği gibi, birden çok arama modeli yoktur veya kısa çizgi (-) ile başlayan bir deseni korumak için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.