Quando usar \ na string de pesquisa do grep

1

Eu tenho conteúdo de arquivo semelhante a:

A+B
C+D
A+B

Estas são strings. Eu quero procurar a ocorrência de A+B . Então eu escrevo o comando como: grep 'A+B' test.txt . No entanto, se eu escrever grep 'A\+B' test.txt , não obtenho nenhum resultado? Enquanto se, em vez de + , a cadeia contiver . , se eu adicionar \ ou nem adicionar, obtenho os resultados da pesquisa. Eu não entendo:

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

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

    
por user9371654 09.06.2018 / 18:21

2 respostas

0

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

Basic vs Extended Regular Expressions

In basic regular expressions the meta-characters ?, +, {, |, (,
and ) lose their special meaning; instead use the backslashed
versions \?, +, {, \|, (, and ).

Observe que, se você usou -E , mudaria para Extended Regular Expressions (ERE) e teria que usar \+ , porque, por padrão, em ERE e muitas outras expressões regulares sintaxes + significa 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 procurar caracteres literais.

  2. Em BRE , um único ponto representa any character , como em ERE .

por 09.06.2018 / 18:35
0

Em egrep (ou grep -E ), expressões regulares estendidas são ativadas. Estes incluem:

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

Eles podem ser usados no grep básico com uma barra invertida anterior, que não tem o seu significado usual de fazer literal, mas invoca a função egrep .

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, seguida imediatamente por B .

Como em egrep há um significado especial para '+', ele deve ter o escape para corresponder literalmente, então o seguinte também é equivalente:

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

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

Outras funções egrep que podem ser usadas escapando em grep include \| para strings de correspondência alternativa e \{M,N\} , em que M e N são números representando 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 .

    
por 09.06.2018 / 19:00