
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.txt
nã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 grep
usar, mas é possível que você use GNU grep
. Por padrão grep
usa 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 -E
você mudaria para Extended Regular Expressions (ERE)
e teria que usar \+
porque por padrão in
ERE
e 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:
Você deve usar
\
quando quiser pesquisar caracteres literais.Em
BRE
um único ponto significaany character
exatamente como emERE
.
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 grep
com uma barra invertida precedente, que não tem o significado usual de tornar literal, mas invoca a egrep
função.
Portanto, os seguintes são equivalentes: -
egrep 'A+B'
grep 'A\+B'
Em ambos os casos, a correspondência é para um ou mais A
s seguidos imediatamente por B
.
Como egrep
existe 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 egrep
funções que podem ser usadas escapando in grep
incluem \|
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
.