4

Я просто изучаю семейство программ grep, и мне кажется, что egrep строго превосходит grep - он может делать все, что может делать grep, но больше. Я ошибся? Почему бы просто не использовать egrep каждый раз?

РЕДАКТИРОВАТЬ: я знаю, что grep -E это то же самое, что egrep. Я хочу знать, почему grep -E не является режимом по умолчанию для grep, поскольку он только расширяет возможности его использования и не имеет явных недостатков.

4 ответа4

16

Технический ответ: традиционно egrep внутренне использовал детерминированный конечный автомат (DFA), а grep использовал недетерминированный конечный автомат (NFA). В наши дни GNU grep и egrep используют гибридный подход NFA/DFA.

В соответствии с книгой Фридла « Освоение регулярных выражений», чтобы выяснить, есть ли у вашего egrep (например) механизм NFA или есть DFA, попробуйте:

echo =XX========================================= | egrep 'X(.+)+X'

Фрейдл (с.147) говорит:

Если это займет много времени, чтобы закончить, это NFA ... Если он заканчивается быстро, это либо DFA, либо NFA с некоторой продвинутой оптимизацией. Отображается ли предупреждающее сообщение о превышении стека или длинном совпадении? Если так, то это NFA.

Фридл описывает механизм NFA как "ориентированный на регулярные выражения", а DFA - как "ориентированный на текст". Детали различия описаны со стр. 153 его книги.

Следствием этого является то, что есть некоторые комбинации шаблон / текст, которые быстрее сопоставляются с DFA, а некоторые - быстрее с NFA. Кроме того, способ написания регулярного выражения для NFA может существенно повлиять на скорость сопоставления. Зачастую DFA будет быстрее, но DFA не поддерживают ленивое сопоставление, в некоторых случаях они совпадают, они не могут выполнять обратные выражения или обратные ссылки, и в них отсутствуют некоторые другие функции по сравнению с NFA.

Согласно Freidl, GNU grep использует DFA, когда это возможно, и возвращается к NFA, когда используются обратные ссылки.

2

"Семейство" - это просто ярлыки для различных опций grep (от man grep):

Кроме того, доступны три варианта программ egrep, fgrep и rgrep. egrep такой же, как grep -E. fgrep - это то же самое, что и grep -F. rgrep - это то же самое, что и grep -r. Прямой вызов egrep или fgrep устарел, но предоставляется, чтобы позволить историческим приложениям, которые полагаются на них, работать без изменений.

   -E, --extended-regexp
          Interpret  PATTERN  as  an  extended   regular
          expression (ERE, see below).  (-E is specified
          by POSIX.)

   -F, --fixed-strings
          Interpret PATTERN as a list of fixed  strings,
          separated  by  newlines, any of which is to be
          matched.  (-F is specified by POSIX.)

   -R, -r, --recursive
          Read   all   files   under   each   directory,
          recursively;  this  is  equivalent  to  the -d
          recurse option.
1

egrep - это просто сокращение для grep -E которое позволяет использовать расширенные регулярные выражения. Проверьте man-страницу egrep - она откроет man-страницу для "семейства" функций поиска по шаблону, таких как grep, egrep, fgrep и т.д.

Что касается использования, если вы используете расширенные регулярные выражения, то ввод egrep может быть быстрее, чем вводить grep -E все время.

0

Недостаток egrep том, что его регулярное выражение немного сложнее и менее удобно, если вам не нужны дополнительные возможности. Иногда большая мощность не лучше, если она не так проста и легка в использовании.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .