Insegura de saída do grep devido a curingas do bash

1

Estou tentando entender melhor os comandos do bash.

ls /usr/include/ | grep \.h

Deveria listar todos os arquivos que terminam em .h (bibliotecas C), mas gera mais do que o esperado.

th read_db .h

u ch ar .h

neta sh

Se alguém também pudesse me dizer como negrito o .h na pergunta sem separá-lo do resto do nome com um espaço, eu o appriciate.

    
por someoneb100 10.06.2016 / 19:23

1 resposta

3

Em grep , seu padrão está combinando .h (qualquer caractere seguido por h ) em qualquer lugar da linha, não apenas no final.

Você basicamente tem dois problemas:

  1. Quoting / problema de escape

  2. Problema de padrão de expressão regular

Explicações:

  1. Você escapou de . usando \. e não usou nenhuma aspas ou outro \ , portanto, o escape escaparia do shell e grep obteria o padrão Regex como .h , no termo Regex que significa qualquer caractere seguido por um h . Seu objetivo é fazer com que grep trate o . literal, então você precisa citar ou adicionar outro \ como:

    '\.h'
    \.h
    
  2. Agora, o segundo problema, em regex, o final de uma linha é expresso pelo quantificador $ , de modo que você precisa corresponder ao .h no final da linha:

    '\.h$'
    

Então, juntos, o uso correto seria:

ls /usr/include/ | grep '\.h$'

Agora, o mais importante, não analisar ls .

O que você está fazendo pode ser feito de forma fácil e eficiente por meio de globalização básica:

ls /usr/include/*.h
    
por heemayl 10.06.2016 / 19:26