用命令的输出做两件事


9

我有一个程序texcount可以输出LaTeX文档中的单词数。我还可以通过管道输出,sed以制作换行符TeX换行符,并将其写入文件,然后将其包含在最终文档中。但是,当我执行时texcount foo.tex | sed s/$/'\\\\'/ > wc.tex,命令行输出texcount被抑制。

如何获得第一个命令的输出以显示在终端中并通过管道传输到sed?

Answers:


9

您可以对第二个命令使用匿名管道:

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

这个答案的关键部分是使用tee。如果您有某些像Bash这样的外壳,则可以使用来管道tee的输出>(some further commands)。在其他Shell中,您必须给tee一个文件名参数(这是它的标准操作模式),然后运行some further commands < thatfile,然后删除该文件。或在下面查看Hari的答案。
dubiousjim 2012年

三通,三通和三通。
bagavadhar 2012年

7

您需要“ tee”命令,该命令允许您拆分管道。

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

这将为您留下额外的output.txt文件。请阅读以下内容以获取更多信息:http : //www.unixtutorial.org/2007/12/tee-replicate-standard-output/ 您也可以执行“ man tee”。


texcount foo.tex | tee unmodified |sed s/$/'\\\\'/ > modified将输出的修改和未修改版本放入两个文件中。如何将未修改的版本打印到终端?我试过了,tee stdout但是什么也没印出来……
Seamus

3
您不能这样做,因为tee将其输入发送到stdout和一个文件。stdout成为sed的输入。您可以&& cat unmodified在末尾添加。这会将未修改的输出转储到终端。
KeithB 2011年

正确的命令行是texcount foo.tex | tee output.txt | sed s/$/'\\\\'/ > wc.tex ; cat output.txt。或者您可以使用texcount foo.tex | tee output.txt; sed s/$/'\\\\'/ output.txt > wc.tex。无论哪种情况,您都可能想要rm output.txt之后。
dubiousjim 2012年

@dubiousjim分号是正确的-管道有效,但分号更好地表达了预期的含义。
Danny Staple 2012年

6

您可以使用相当惯用的

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

/dev/tty 是一个魔术设备,指的是当前进程的控制终端。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.