Когда использовать \ в строке поиска grep

Когда использовать \ в строке поиска grep

У меня есть файл с похожим содержимым:

A+B
C+D
A+B

Это строки. Я хочу найти вхождение A+B. Поэтому я пишу команду как: grep 'A+B' test.txt. Однако, если я напишу, grep 'A\+B' test.txtя не получу никаких результатов? В то время как если вместо +строки содержится ., если я добавлю \или не добавлю, я получу результаты поиска. Я не понимаю:

1) Когда следует добавлять \, а когда нет.

2) Почему я не получил никаких результатов, когда добавил его, +хотя получил результаты, когда добавил его.

решение1

Вы не указали, какой сорт grepвы используете, но возможно вы используете GNU grep. По умолчанию grepиспользуется Basic Regular Expressions, и как это объясняется в man grep:

Базовые и расширенные регулярные выражения

В основных регулярных выражениях метасимволы ?, +, {, |, (,
и ) теряют свое особое значение; вместо них используются
версии с обратной косой чертой \?, +, {, \|, (, и ).

Обратите внимание, что если бы вы использовали , -Eвам пришлось бы переключиться на Extended Regular Expressions (ERE)и пришлось бы использовать , \+поскольку по умолчанию в EREи многих других синтаксисах регулярных выражений +обозначается one or more of the preceding character:

$ grep -E 'A\+B' test.txt
A+B
A+B

Итак, отвечая на ваши вопросы:

  1. Его следует использовать \, когда требуется выполнить поиск буквального символа.

  2. В BREодной точке обозначается any characterто же самое, что и в ERE.

решение2

В egrep(или grep -E) включены расширенные регулярные выражения. Они включают:

+ - match one or more instances of the previous match pattern.

Их можно использовать в Basic grepс предшествующей обратной косой чертой, которая не имеет своего обычного значения, а вызывает функцию egrep.

Итак, следующие утверждения эквивалентны:-

egrep 'A+B'
grep 'A\+B'

В обоих случаях соответствие определяется по одному или нескольким символам As, за которыми сразу следует B.

Поскольку egrepдля «+» существует особое значение, его необходимо экранировать для буквального соответствия, поэтому следующие выражения также эквивалентны:

egrep 'A\+B'
grep 'A+B'

Оба варианта будут соответствовать друг другу A+B, поскольку в обоих случаях ищется буквальный символ «+».

Другие egrepфункции, которые можно использовать путем экранирования в, grepвключают \|альтернативные строки соответствия и \{M,N\}, где M и N — числа, представляющие минимальное и максимальное количество повторений в шаблоне соответствия. Они не экранируются в egrep.

Связанный контент