Яка різниця між варіантом grep -e та grep -E?


34

Я намагаюся зрозуміти різницю між grep -eі grep -E. Тепер grep manpageя отримав:

-E, - розширений-regexp

Інтерпретувати PATTERN як розширений регулярний вираз (див. Нижче).

-e PATTERN, --regexp = PATTERN

Використовуйте PATTERN як візерунок; корисно захистити візерунки, починаючи з -

Наведене пояснення для мене не має сенсу.

Отже, чи може хтось мені це пояснити, використовуючи, в examplesчому різниця між ними та коли використовувати який варіант.

PS: Версія: grep (GNU grep) 2.10



3
Мета -eнасправді просто роз'єднати, коли регулярний вираз починається з тире. Так grep ---fooдає, unrecognized option: ---fooале ви можете сказати grep -e ---fooгреп за регулярний вираз ---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з

@ronnie це шкода, що вам потрібна 200+ репутація, щоб ця "особливість" стежила за вами між сайтами SE ...
hafichuk

5

Також grep -eдозволяє використовувати кілька рядків для пошуку: 'grep -e 'abc' -e 'def' -e '123'буде шукати всі три ці рядки: abcяк і defі 123.

Це працює дуже схоже на , grep 'abc\|def\|123'де \|стоїть за , orале може бути трохи більш читабельним.

Оскільки grep -Eтут вже пояснюються найважливіші факти , я просто хочу додати те, що я підсумував на цю тему з досить схожого питання: Регулярний вираз для пошуку подвійних символів у Bash


3

Дивись нижче

/ розширений

grep розуміє три різні версії синтаксису регулярних виразів: "basic", "Extended" та "perl". У GNU grep немає різниці у доступній функціональності між базовими та розширеними синтаксисами. В інших реалізаціях основні регулярні вирази менш потужні. Наступний опис стосується розширених регулярних виразів; різниці для основних регулярних виразів підсумовуються згодом. Регулярні вирази Perl надають додаткову функціональність і задокументовані у pcresyntax (3) та pcrepattern (3), але можуть бути недоступні у кожній системі.

Отже, ще раз.

У GNU grep немає різниці у доступній функціональності між основними та розширеними синтаксисами


2
функціональність одне і те ж між основним і розширеним , але синтаксис трохи відрізняється. РегВир спеціальні символи , такі як (, ), і |т.д. потрібно бути зворотною косою межею , щоб мати свій особливий сенс в основному регулярних виразів, але не в протяжних (там , де вони повинні бути екрановані , щоб розглядатися в якості строкового литерала)
саз

1

Просто детальніше розглянути -eваріант. -eчасто необов’язковий:

grep PATTERN

тотожна

grep -e PATTERN

якщо, як зазначено в попередньому відповіді та на вказівних сторінках, існує кілька моделей пошуку або для захисту шаблону, що починається з дефісу (-).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.