Я пытаюсь изучить, как fgrep отличается от grep. Однако в моих результатах испытаний, нет никакого различия. По-видимому, fgrep соответствует на строках и игнорирует regex. Таким образом, я проверил это и не было абсолютно ничего, что основной fgrep может сделать, что grep не может. Таким образом, я не могу идти дальше, я должен понять, почему у меня есть результаты ниже, и каково различие между fgrep, так как я категорически не вижу различия ни в каком результате испытаний.
$ cat testfile
subscribe|unsubscribe
@lp1n3
$ grep 'subscribe|unsubscribe' testfile
subscribe|unsubscribe
$ fgrep 'subscribe|unsubscribe' testfile
subscribe|unsubscribe
$ grep '@lp1n3' testfile
@lp1n3
$ fgrep '@lp1n3' testfile
@lp1n3
Можно найти полезным добавить -o
переключатель, чтобы помочь видеть, что происходит:
$ grep -o 'subscribe|unsubscribe' testfile
subscribe|unsubscribe
Здесь мы используем grep
в режиме Basic Regular Expression, где |
не является особенным (этого должны были бы оставить \|
означать OR
), таким образом, шаблон подобран как единственная строка
$ grep -oE 'subscribe|unsubscribe' testfile
subscribe
unsubscribe
Здесь мы переключились на режим Extended Regular Expression (ERE), где |
regex специальный символ, таким образом, мы соответствуем двум шаблонам, subscribe
и unsubscribe
$ grep -oF 'subscribe|unsubscribe' testfile
subscribe|unsubscribe
Теперь мы соответствуем в фиксированном строковом режиме (как fgrep
) и как ожидалось |
не является особенным - точно так же, как BRE.
fgrep
(официально, удержан от использования) эквивалентный из grep -F
таким образом, это ведет себя точно то же:
$ fgrep -o 'subscribe|unsubscribe' testfile
subscribe|unsubscribe
Насколько мне известно, @
не является особенным или в BRE или в ДО, так будет всегда давать тот же результат как fgrep
или grep -F
.