Ajuda com o uso de aspas nas pesquisas do grep

2

Eu tenho um arquivo com variáveis no formato a (i)% b (j)% c onde a, b e c são sempre os mesmos, mas os índices i e j podem ser diferentes (incluindo múltiplos personagens). Então, eu brinquei com o grep para encontrar instâncias dessas variáveis, mas o sucesso depende de eu incluir ou não aspas em minha string de pesquisa e estou tentando entender por que existem diferenças. Comecei procurando por casos de índices de caractere único:

(1) grep a\(.\)\%b\(.\)\%c file funciona como esperado

(2) grep 'a\(.\)\%b\(.\)\%c' file sem correspondências

(3) grep "a\(.\)\%b\(.\)\%c" file sem correspondências

Então (para me confundir ainda mais!), eu tentei incluir a possibilidade de índices de múltiplos caracteres:

(4) grep a\(.*\)\%b\(.*\)\%c file não funciona - zsh: nenhuma correspondência encontrada: a (. )% b (. )% c

(5) grep 'a\(.*\)\%b\(.*\)\%c' file funciona

(6) grep "a\(.*\)\%b\(.*\)\%c" file funciona

Alguém poderia explicar o que está acontecendo em cada um desses casos? No caso (4), parece que o shell (zsh) está fazendo algo diferente por causa dos asteriscos, mas não tenho certeza do que está fazendo. E por que (1), (5) e (6) trabalham, mas (2) e (3) não é particularmente confuso para mim.

Obrigado!

    
por John S. 14.11.2014 / 20:31

1 resposta

3

Você deve distinguir entre shell escaping e grep escapes.

Expressões regulares básicas (BRE; que são usadas se grep for usado sem a opção -E ) tratam ( , ) e | como caracteres normais. As sequências \( e \| têm um significado especial.

Sem as aspas, o shell trata a barra invertida como caractere de escape e a remove, por exemplo, grep não a vê. Com aspas grep vê as barras invertidas, então o significado de ( e | muda.

Com expressões regulares estendidas ( grep -E ), ocorre o contrário: ( e | são especiais e você precisa de um bashslash antes deles para que eles sejam manipulados como caracteres normais.

    
por 14.11.2014 / 21:39