Mit der Ausgabe eines Befehls zwei Dinge tun

9

Ich habe ein Programm texcount, das die Anzahl der Wörter in meinem LaTeX-Dokument ausgibt. Ich kann die Ausgabe auch sedweiterleiten, um die TeX-Zeilenumbrüche der Zeilenumbrüche zu erstellen und diese in eine Datei zu schreiben, die ich dann in mein endgültiges Dokument aufnehmen kann. Aber wenn ich das tue, wird texcount foo.tex | sed s/$/'\\\\'/ > wc.texdie Befehlszeilenausgabe von texcountunterdrückt.

Wie kann ich die Ausgabe des ersten Befehls erhalten, der im Terminal angezeigt und an sed weitergeleitet wird?

Seamus
quelle

Antworten:

9

Sie können eine anonyme Pipe für den zweiten Befehl verwenden:

texcount foo.tex | tee >(sed s/$/'\\\\'/ > wc.tex)
wedeln
quelle
Der wesentliche Teil dieser Antwort ist die Verwendung tee. Wenn Sie bestimmte Muscheln wie Bash sind, können Sie die Ausgabe des T-Stücks mit verwenden >(some further commands). In anderen Shells some further commands < thatfilemüssten Sie tee ein Dateinamenargument geben (dies ist die Standardbetriebsart) und dann ausführen und dann die Datei löschen. Oder siehe Haris Antwort unten.
Dubiousjim
Tee, Tee & Tee.
Bagavadhar
7

Sie benötigen den Befehl "tee", mit dem Sie Rohre teilen können.

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

Dies würde Ihnen die zusätzliche Datei output.txt überlassen. Lesen Sie dies für weitere Informationen: http://www.unixtutorial.org/2007/12/tee-replicate-standard-output/ Sie können auch "man tee" machen.

Danny Staple
quelle
texcount foo.tex | tee unmodified |sed s/$/'\\\\'/ > modifiedFügt modifizierte und nicht modifizierte Versionen der Ausgabe in die beiden Dateien ein. Wie drucke ich die unveränderte Version auf das Terminal? Ich habe versucht, tee stdoutaber das druckt nichts ...
Seamus
3
Sie können das nicht tun, weil tee seine Eingabe an stdout und eine Datei sendet. Das stdout wird zum Input für sed. Sie könnten && cat unmodifiedam Ende hinzufügen . Dadurch wird die unveränderte Ausgabe an das Terminal ausgegeben.
KeithB
Die richtige Kommandozeile wäre hier texcount foo.tex | tee output.txt | sed s/$/'\\\\'/ > wc.tex ; cat output.txt. Oder du könntest verwenden texcount foo.tex | tee output.txt; sed s/$/'\\\\'/ output.txt > wc.tex. In beiden Fällen möchten Sie dann wahrscheinlich rm output.txtdanach.
Dubiousjim
@dubiousjim Dieses Semikolon ist korrekt - die Pipe funktioniert, aber das Semikolon drückt besser aus, was beabsichtigt ist.
Danny Staple
6

Sie können die ziemlich idiomatische verwenden

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

/dev/tty ist ein magisches Gerät, das sich auf das steuernde Terminal des aktuellen Prozesses bezieht.

Hari
quelle