Hacer dos cosas con salida de un comando

9

Tengo un programa texcountque genera la cantidad de palabras en mi documento LaTeX. También puedo canalizar el resultado de esto para sedhacer los saltos de línea TeX de nueva línea y escribir esto en un archivo que luego pueda incluir en mi documento final. Pero cuando hago, texcount foo.tex | sed s/$/'\\\\'/ > wc.texla salida de la línea de comandos texcountse suprime.

¿Cómo puedo obtener la salida del primer comando para que se muestre en la terminal y se canalice a sed?

Seamus
fuente

Respuestas:

9

Puede usar una tubería anónima para el segundo comando:

texcount foo.tex | tee >(sed s/$/'\\\\'/ > wc.tex)
meneo
fuente
La parte esencial de esta respuesta es usar tee. Si tiene ciertos shells como Bash, puede canalizar la salida de tee usando >(some further commands). En otros shells, tendría que darle a tee un argumento de nombre de archivo (este es su modo de operación estándar), y luego ejecutar some further commands < thatfiley luego eliminar ese archivo. O vea la respuesta de Hari a continuación.
dubiousjim
tee, tee y tee.
bagavadhar
7

Necesita el comando "tee", que le permite dividir las tuberías.

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

Esto te dejaría el archivo output.txt adicional. Lea esto para obtener más información: http://www.unixtutorial.org/2007/12/tee-replicate-standard-output/ También puede hacer "man tee".

Danny Staple
fuente
texcount foo.tex | tee unmodified |sed s/$/'\\\\'/ > modifiedpone versiones modificadas y no modificadas de la salida en los dos archivos. ¿Cómo imprimo la versión no modificada en el terminal? Lo intenté tee stdoutpero eso no imprime nada ...
Seamus
3
No puede hacer eso, porque tee envía su entrada a stdout y un archivo. El stdout es lo que se convierte en la entrada a sed. Se podría añadir && cat unmodifiedal final. Eso volcará la salida sin modificar al terminal.
KeithB
La línea de comando adecuada aquí sería texcount foo.tex | tee output.txt | sed s/$/'\\\\'/ > wc.tex ; cat output.txt. O podrías usar texcount foo.tex | tee output.txt; sed s/$/'\\\\'/ output.txt > wc.tex. En cualquier caso, probablemente querrás rm output.txtdespués.
dubiousjim
@dubiousjim Ese punto y coma es correcto: la tubería funciona, pero el punto y coma expresa mejor lo que se pretende.
Danny grapas
6

Puedes usar lo bastante idiomático

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

/dev/tty es un dispositivo mágico que se refiere al terminal de control del proceso actual.

Hari
fuente