Shell one-liner para adicionar uma linha no meio de um tubo

6

Eu escrevo um script que envia o arquivo de entrada para o CPP, depois para o grep e, em seguida, para um determinado programa:

cpp $1 | grep -v "#" | theprogram

Mas, "o programa" requer que a entrada comece com uma certa linha constante "theprogram-1.0". Então, eu quero preceder essa linha constante para a saída do grep, pouco antes de ser enviada para o "theprogram".

Claro, posso fazer tudo isso usando um arquivo temporário ... mas tenho certeza de que há uma maneira de executar uma tarefa tão simples em uma única linha de canos do shell, sem arquivos temporários. Qual é o truque?

    
por Erel Segal-Halevi 19.01.2014 / 18:49

1 resposta

6

Você pode cercar uma sequência de comandos com parênteses. Cada comando dentro dos parênteses terá acesso ao mesmo stdin, stdout e stderr. Aqui, echo enviará para stdout, mas não alterará o stdin que grep vê.

cpp $1 | (echo 'your constant line here'; grep -v "#") | theprogram

Conforme descrito na linguagem de comando do shell: comandos de agrupamento , é possível usar chaves de parênteses para agrupamento. Usar chaves é um pouco mais eficiente, já que um subshell não será criado, mas apresenta uma sintaxe mais complicada: é necessário que haja um separador de campo após o { e um delimitador como ; ou nova linha antes do } . Mas várias pessoas sugeriram isso como uma alternativa, então aqui está:

cpp $1 | { echo 'your constant line here'; grep -v "#"; } | theprogram
    
por 19.01.2014 / 19:00

Tags