В чем разница между опциями grep -e и grep -E?


34

Я пытаюсь понять разницу между grep -eи grep -E. Теперь из grep manpageя получил:

-E, --extended-regexp

Интерпретировать PATTERN как расширенное регулярное выражение (см. Ниже).

-e PATTERN, --regexp = PATTERN

Используйте PATTERN в качестве шаблона; полезно для защиты шаблонов, начинающихся с -

Приведенное выше объяснение не имеет смысла для меня.

Итак, кто-то может объяснить мне, используя examplesразницу между этими двумя вариантами и когда использовать какой вариант.

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



3
Целью на -eсамом деле является просто устранение неоднозначности, когда регулярное выражение начинается с тире. Так что 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 это наоборот
Науэль Фуйе

@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 понимает три разные версии синтаксиса регулярных выражений: «базовый», «расширенный» и «perl». В GNU grep нет различий в доступной функциональности между базовым и расширенным синтаксисами. В других реализациях базовые регулярные выражения менее мощны. Следующее описание относится к расширенным регулярным выражениям; различия для основных регулярных выражений суммируются впоследствии. Регулярные выражения Perl предоставляют дополнительную функциональность и документированы в pcresyntax (3) и pcrepattern (3), но могут быть доступны не во всех системах.

Итак, еще раз.

В GNU grep нет различий в доступной функциональности между базовым и расширенным синтаксисами


2
функциональность одно и то же между основным и расширенным , но синтаксис немного отличается. специальные символы regexp, такие как (, )и |т. д., должны быть экранированы обратным слешем, чтобы иметь свое особое значение в базовом регулярном выражении, но не в расширенном (где они должны быть экранированы, чтобы обрабатываться как строковый литерал)
cas

1

Просто чтобы уточнить -eвариант. -eчасто необязательно:

grep PATTERN

идентично

grep -e PATTERN

если, как указано в предыдущем Ответе и на страницах руководства, не существует нескольких шаблонов поиска или для защиты шаблона, начинающегося с дефиса (-).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.