bash regex: asterisco dá resultados de pesquisa ambíguos com grep

2

Estou usando um arquivo de texto simples para testar o * meta-character através do grep. O arquivo de texto é como abaixo:

1
11
111
1111
11111
111111

d
da
daa
daaa

b
bc
bcc
bccc

Agora, quando eu procuro o dígito 1 usando o grep assim:

grep 1* regex.txt

saída é

1
11
111
1111
11111
111111

d
da
daa
daaa

b
bc
bcc
bccc

Mesmo no caso do caractere 'd', o resultado é o mesmo com o realce 'd' em vermelho MAS no caso do personagem 'a' & 'b' não há saída para o seguinte comando de pesquisa:

grep a* regex.txt
grep b* regex.txt

E os comandos abaixo fornecem resultados esperados

grep "a*" regex.txt
grep "b*" regex.txt

Por que isso? Por que é bash parcial em relação ao caractere 'd' e não a 'a' & 'b'

    
por Sudhish Vln 14.11.2015 / 10:49

1 resposta

3

Isso está acontecendo porque os a* e b* não são citados e, portanto, são expandidos pelo shell anterior sendo passado para grep . Por exemplo, considere este diretório:

$ ls    
afile.txt bfile.txt regex.txt

Se eu tentar executar grep a* regex.txt , o a* se tornará afile.txt e é isso que será fornecido como um padrão de pesquisa para grep . Podemos usar a opção de depuração do bash ( set -x ) para demonstrar:

$ set -x
$ grep a* regex.txt
+ grep --color afile.txt regex.txt

O motivo pelo qual funcionou para d e não para a ou b é que você tem arquivos ou diretórios cujos nomes começam com a e b em seu diretório atual. Se você não fez, teria funcionado:

$ ls
afile.txt bfile.txt regex.txt
$ grep a* regex.txt  ## no output, it's searching for 'afile.txt'
$ rm afile.txt       ## now there are no filenames starting with a
$ grep a* regex.txt
1
11
111
1111
11111
111111

d
da
daa
daaa

b
bc
bcc
bccc

Para evitar isso, sempre cite seus padrões de pesquisa :

grep "a*" regex.txt

Ou

grep 'a*' regex.txt
    
por 14.11.2015 / 11:30