resultados estranhos com expressão regular grep quando usado com pipe

1

Eu tenho 3 arquivos: test1, test2, test3.sh. O arquivo test3.sh tem nomes de arquivos test1 e test2 como seu conteúdo. Eu não consigo entender o resultado da saída do comando abaixo:

sh-4.3$ touch test1 test2                                                                                                                                                       
sh-4.3$ ls                                                                                                                                                                      
main.sh  test1 test2                                                                                                                                                                                                                                                                                                
sh-4.3$ cat > test3.sh                                                                                                                                                          
test1                                                                                                                                                                           
test2                                                                                                                                                                           
sh-4.3$ cat test3.sh                                                                                                                                                            
test1                                                                                                                                                                           
test2                                                                                                                                                                           
sh-4.3$ ls                                                                                                                                                                      
main.sh  test1  test2  test3.sh                                                                                                                                                 
sh-4.3$ ls | grep test*  

test3.sh:test1

o comando grep acima fornece o texto correspondente no arquivo test3.sh, mas e a saída do comando ls, pois também contém a palavra "test". O shell está ignorando a saída do comando ls enquanto faz a pesquisa de padrões?

    
por Pankaj Pandey 21.11.2016 / 08:49

1 resposta

1

O shell expande seu * para todos os arquivos correspondentes no diretório atual antes de grep vê-lo, então o comando após a expansão é

grep test1 test2 test3.sh

grep interpreta o primeiro argumento test1 como o padrão a ser procurado e os outros argumentos como os nomes dos arquivos a serem examinados. A saída de ls é passada como texto em STDIN de grep e não como nomes de arquivos, e parece que isso é ignorado, já que não faz sentido na sintaxe do grep após a expansão ter sido realizada.

Sempre cite seu regex

$ ls | grep 'test*'
test1
test2
test3.sh
    
por Zanna 21.11.2016 / 09:01