Faire deux choses avec la sortie d'une commande

9

J'ai un programme texcountqui génère le nombre de mots dans mon document LaTeX. Je peux également diriger la sortie de ceci pour sedcréer des sauts de ligne TeX et écrire ceci dans un fichier que je pourrai ensuite inclure dans mon document final. Mais quand je fais texcount foo.tex | sed s/$/'\\\\'/ > wc.texla sortie de ligne de commande de texcountest supprimée.

Comment puis-je afficher la sortie de la première commande dans le terminal et la canaliser vers sed?

Seamus
la source

Réponses:

9

Vous pouvez utiliser un canal anonyme pour la deuxième commande:

texcount foo.tex | tee >(sed s/$/'\\\\'/ > wc.tex)
remuer
la source
L'essentiel de cette réponse est d'utiliser tee. Si vous êtes certains shells comme Bash, vous pouvez diriger la sortie de tee en utilisant >(some further commands). Dans d'autres shells, vous devrez donner à tee un argument de nom de fichier (c'est son mode de fonctionnement standard), puis exécuter some further commands < thatfile, puis supprimer ce fichier. Ou voir la réponse de Hari ci-dessous.
dubiousjim
tee, tee & tee.
bagavadhar
7

Vous avez besoin de la commande "tee", qui vous permet de diviser les tuyaux.

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

Cela vous laisserait le fichier output.txt supplémentaire. Lisez ceci pour plus d'informations: http://www.unixtutorial.org/2007/12/tee-replicate-standard-output/ Vous pouvez également faire "man tee".

Danny Staple
la source
texcount foo.tex | tee unmodified |sed s/$/'\\\\'/ > modifiedplace les versions modifiées et non modifiées de la sortie dans les deux fichiers. Comment imprimer la version non modifiée sur le terminal? J'ai essayé tee stdoutmais ça n'imprime rien ...
Seamus
3
Vous ne pouvez pas faire cela, car tee envoie son entrée à stdout et à un fichier. La sortie standard est ce qui devient l'entrée de sed. Vous pourriez ajouter && cat unmodifiedà la fin. Cela videra la sortie non modifiée sur le terminal.
KeithB
La ligne de commande appropriée serait ici texcount foo.tex | tee output.txt | sed s/$/'\\\\'/ > wc.tex ; cat output.txt. Ou vous pourriez utiliser texcount foo.tex | tee output.txt; sed s/$/'\\\\'/ output.txt > wc.tex. Dans les deux cas, vous voudrez probablement rm output.txtensuite.
dubiousjim
@dubiousjim Ce point-virgule est correct - le tuyau fonctionne, mais le point-virgule exprime mieux ce qui est prévu.
Danny Staple
6

Vous pouvez utiliser le assez idiomatique

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

/dev/tty est un dispositif magique qui fait référence au terminal de contrôle du processus actuel.

Hari
la source