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

242
user9371654

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

A+B C+D A+B 

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

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

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

1

2 ответа на вопрос

0
Arkadiusz Drabczyk

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

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

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

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

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

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

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

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

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

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

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