Fazendo duas coisas com a saída de um comando

9

Eu tenho um programa texcountque gera o número de palavras no meu documento LaTeX. Também posso canalizar a saída disso para sedcriar novas linhas de quebra de linha TeX e gravar isso em um arquivo que eu possa incluir no meu documento final. Mas quando eu faço texcount foo.tex | sed s/$/'\\\\'/ > wc.texa saída da linha de comando texcounté suprimida.

Como faço para que a saída do primeiro comando seja exibida no terminal e canalizada para sed?

Seamus
fonte

Respostas:

9

Você pode usar um canal anônimo para o segundo comando:

texcount foo.tex | tee >(sed s/$/'\\\\'/ > wc.tex)
abanar
fonte
A parte essencial desta resposta é usar tee. Se você tem certas cascas como o Bash, pode canalizar a saída do tee usando >(some further commands). Em outros shells, você teria que fornecer ao tee um argumento de nome de arquivo (esse é o modo padrão de operação), executar some further commands < thatfilee excluir o arquivo. Ou veja a resposta de Hari abaixo.
dubiousjim
tee, tee e tee.
bagavadhar
7

Você precisa do comando "tee", que permite dividir tubos.

texcount foo.tex | tee >output.txt | sed s/$/'\\\\'/ > wc.tex ; cat output.txt

Isso deixaria o arquivo output.txt adicional. Leia isto para obter mais informações: http://www.unixtutorial.org/2007/12/tee-replicate-standard-output/ Você também pode fazer "man tee".

Danny Staple
fonte
texcount foo.tex | tee unmodified |sed s/$/'\\\\'/ > modifiedcoloca versões modificadas e não modificadas da saída nos dois arquivos. Como imprimo a versão não modificada no terminal? Eu tentei tee stdout, mas que imprime nada ...
Seamus
3
Você não pode fazer isso, porque tee envia sua entrada para stdout e um arquivo. O stdout é o que se torna a entrada para o sed. Você pode adicionar && cat unmodifiedno final. Isso descarregará a saída não modificada no terminal.
KeithB
A linha de comando adequada aqui seria texcount foo.tex | tee output.txt | sed s/$/'\\\\'/ > wc.tex ; cat output.txt. Ou você poderia usar texcount foo.tex | tee output.txt; sed s/$/'\\\\'/ output.txt > wc.tex. Em ambos os casos, você provavelmente desejaria rm output.txtdepois.
dubiousjim
@dubiousjim Esse ponto e vírgula está correto - o tubo funciona, mas o ponto e vírgula expressa melhor o que se destina.
Danny Staple
6

Você pode usar o bastante idiomático

texcount foo.tex | tee /dev/tty | sed s/$/'\\\\'/ > wc.tex

/dev/tty é um dispositivo mágico que se refere ao terminal de controle do processo atual.

Hari
fonte