Programa para filtrar as linhas, passando-as para um programa externo?

4

Estou procurando um programa para usar um programa externo para filtrar as linhas de um fluxo - praticamente uma versão de grep que, para cada linha, imprime ou suprime com base no fato de o programa especificado sair com um código de saída zero (como find ' -exec option).

Eu sei que posso fazer isso no shell usando um loop e um subshell:

some-program |(while read line; do
    if predicate "$line"; then
        echo "$line"
    fi
done)

O que eu estou querendo saber é se existe um programa flutuante que me permita simplificar:

some-program |filter predicate
# want negation as well
some-program |filter ! predicate

Alguém poderia pensar que um Sed melhorado poderia suportar isso, perguntando "ele passa no espaço padrão?", mas o GNU Sed não parece ter tal facilidade.

Existe algum programa desse tipo que eu não encontrei, ou eu só preciso fazer isso no shell (ou perl)?

    
por Michael Ekstrand 22.06.2011 / 17:49

1 resposta

1

O shell é uma ferramenta perfeitamente adequada para este trabalho. Apenas tome cuidado para não distorcer espaços e barras invertidas.

while IFS= read -r line; do
  if predicate "$line"; then printf '%s\n' "$line"; done
done

Você também pode usar o awk. Não deixe de citar cada linha, pois ela será passada para um shell (o snippet abaixo coloca aspas simples ao redor da linha e substitui as aspas simples na linha por '\'' ; 7 is ' ). Como cada chamada de comando passa por um shell, espero que seja mais lento que o método shell puro, mesmo que o awk provavelmente seja mais rápido nas linhas de análise. Mas eu não fiz nenhum benchmark.

awk '{quoted=$0; gsub(/7/, "7\\77")}
     !system("predicate 7" $0 "7")'
    
por 23.06.2011 / 02:19