1

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

A+B
C+D
A+B

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

1) Когда я должен добавить \ а когда нет.

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

2 ответа2

0

Вы не указали, какой тип 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 .

0

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

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

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

Таким образом, следующее эквивалентно:

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

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

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

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

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

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

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