Quando usar \ na string de pesquisa grep

Quando usar \ na string de pesquisa grep

Tenho conteúdo de arquivo semelhante a:

A+B
C+D
A+B

Estas são cordas. Quero procurar a ocorrência de A+B. Então escrevo o comando como: grep 'A+B' test.txt. Porém, se eu escrever grep 'A\+B' test.txtnão obtenho nenhum resultado? Embora if em vez da +string contém ., se eu adicionar \ou não adicionar, obtenho os resultados da pesquisa. Eu não entendi:

1) Quando devo adicionar \e quando não devo.

2) Por que não obtive nenhum resultado quando adicionei, +enquanto obtive resultados quando adicionei.

Responder1

Você não especificou qual sabor grepusar, mas é possível que você use GNU grep. Por padrão grepusa Basic Regular Expressions, e como é explicado em man grep:

Expressões regulares básicas versus estendidas

Em expressões regulares básicas, os metacaracteres ?, +, {, |, (,
e ) perdem seu significado especial; em vez disso, use as
versões com barra invertida \?, +, {, \|, (, e ).

Observe que se você usasse -Evocê mudaria para Extended Regular Expressions (ERE)e teria que usar \+porque por padrão in EREe muitas outras sintaxes de expressões regulares +significam one or more of the preceding character:

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

Então, para responder às suas perguntas:

  1. Você deve usar \quando quiser pesquisar caracteres literais.

  2. Em BREum único ponto significa any characterexatamente como em ERE.

Responder2

Em egrep(ou grep -E) expressões regulares estendidas estão habilitadas. Esses incluem:

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

Eles podem ser usados ​​​​em básico grepcom uma barra invertida precedente, que não tem o significado usual de tornar literal, mas invoca a egrepfunção.

Portanto, os seguintes são equivalentes: -

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

Em ambos os casos, a correspondência é para um ou mais As seguidos imediatamente por B.

Como egrepexiste um significado especial para '+', ele deve ser escapado para corresponder literalmente, portanto, o seguinte também é equivalente:

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

Ambos corresponderão A+B, já que um literal '+' é procurado em ambos os casos.

Outras egrepfunções que podem ser usadas escapando in grepincluem \|strings de correspondência alternativas e \{M,N\}, onde M e N são números que representam o mínimo e o máximo de repetições em um padrão de correspondência. Estes não são escapados em egrep.

informação relacionada