
У меня есть файл с похожим содержимым:
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
Итак, отвечая на ваши вопросы:
Его следует использовать
\
, когда требуется выполнить поиск буквального символа.В
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'
В обоих случаях соответствие определяется по одному или нескольким символам A
s, за которыми сразу следует B
.
Поскольку egrep
для «+» существует особое значение, его необходимо экранировать для буквального соответствия, поэтому следующие выражения также эквивалентны:
egrep 'A\+B'
grep 'A+B'
Оба варианта будут соответствовать друг другу A+B
, поскольку в обоих случаях ищется буквальный символ «+».
Другие egrep
функции, которые можно использовать путем экранирования в, grep
включают \|
альтернативные строки соответствия и \{M,N\}
, где M и N — числа, представляющие минимальное и максимальное количество повторений в шаблоне соответствия. Они не экранируются в egrep
.