Questão Grep não consegue encontrar a sequência após atribuir à variável


Eu corro:

awk -F ',' '{print $2}' data.dat | sort | uniq |  tr '\n' ',' | grep "*)>nS4XkrlH  @XUL"

e a sequência está localizada nos resultados.

Então eu corro

b=`awk -F ',' '{print $2}' data.dat | sort | uniq |  tr '\n' ','`
echo $b | grep "*)>nS4XkrlH  @XUL"

mas nenhum resultado é retornado.

Alguém tem alguma ideia de por que isso acontece?

Obrigado por qualquer ajuda.


1


origem




Respostas:


A diferença chave-chave entre essas duas sequências de comando é que a segunda contém echo $b que executa shell divisão de palavras. Para fazer com que a segunda sequência de comandos seja executada da mesma maneira que a primeira, substitua:

echo $b | grep "*)>nS4XkrlH  @XUL"

com:

echo "$b" | grep "*)>nS4XkrlH  @XUL"

Divisão de palavras

Observe como os espaços são tratados nesses dois echo afirmações:

$ b="a   b c"
$ echo "$b"
a   b c
$ echo $b
a b c

Sem as aspas duplas, o shell executa a divisão de palavras nos argumentos para echo. Isso significa que todos os espaços em branco consecutivos são condensados ​​em um único espaço. Com aspas duplas, a divisão de palavras é suprimida e o espaço em branco é preservado.

Divisão de palavras e um grep Padrão com vários espaços

Seu grep padrão contém dois espaços consecutivos. A menos que o argumento para echo está entre aspas duplas, a saída de echo não terá esses dois espaços e nenhuma correspondência será encontrada. Observar:

$ b="*)>nS4XkrlH  @XUL"
$ echo $b | grep "*)>nS4XkrlH  @XUL"
$ echo "$b" | grep "*)>nS4XkrlH  @XUL"
*)>nS4XkrlH  @XUL

O primeiro grep não corresponde em nada, mas o segundo faz. A diferença é a divisão de palavras do shell.


0



Você está certo! A explicação foi muito boa. - dr.doom