Fare due cose con l'output di un comando


9

Ho un programma texcountche genera il numero di parole nel mio documento LaTeX. Posso anche convogliare l'output di questo per sedcreare le nuove interruzioni di riga TeX e scriverlo in un file che posso quindi includere nel mio documento finale. Ma quando faccio texcount foo.tex | sed s/$/'\\\\'/ > wc.texl'output della riga di comando di texcountviene soppresso.

Come posso ottenere l'output del primo comando da visualizzare nel terminale e reindirizzato a sed?

Risposte:


9

Puoi usare una pipe anonima per il secondo comando:

texcount foo.tex | tee >(sed s/$/'\\\\'/ > wc.tex)

La parte essenziale di questa risposta è usare tee. Se sei certo di shell come Bash, puoi pipe l'output di tee usando >(some further commands). In altre shell, dovresti dare a tee un argomento per il nome del file (questa è la sua modalità operativa standard), quindi eseguire some further commands < thatfile, quindi eliminare quel file. O vedi la risposta di Hari qui sotto.
dubiousjim,

Tee, Tee & Tee.
Bagavadhar,

7

È necessario il comando "tee", che consente di dividere i tubi.

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

Ciò lascerebbe il file output.txt aggiuntivo. Leggi questo per maggiori informazioni: http://www.unixtutorial.org/2007/12/tee-replicate-standard-output/ Puoi anche fare "man tee".


texcount foo.tex | tee unmodified |sed s/$/'\\\\'/ > modifiedinserisce le versioni modificate e non modificate dell'output nei due file. Come faccio a stampare la versione non modificata sul terminale? Ci ho provato tee stdoutma questo non stampa nulla ...
Seamus,

3
Non puoi farlo, perché tee invia il suo input a stdout e ad un file. Lo stdout è ciò che diventa l'input di sed. Potresti aggiungere && cat unmodifiedalla fine. Ciò scaricherà l'output non modificato sul terminale.
KeithB,

La riga di comando corretta qui sarebbe texcount foo.tex | tee output.txt | sed s/$/'\\\\'/ > wc.tex ; cat output.txt. Oppure potresti usare texcount foo.tex | tee output.txt; sed s/$/'\\\\'/ output.txt > wc.tex. In entrambi i casi, probabilmente vorrai farlo rm output.txtsuccessivamente.
dubiousjim,

@dubiousjim Quel punto e virgola è corretto: la pipe funziona, ma il punto e virgola esprime meglio ciò che si intende.
Danny Staple,

6

Puoi usare il abbastanza idiomatico

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

/dev/tty è un dispositivo magico che si riferisce al terminale di controllo del processo corrente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.