Делать две вещи с выводом из команды

9

У меня есть программа, texcountкоторая выводит количество слов в моем документе LaTeX. Я также могу направить выходные данные этого, чтобы sedсделать переносы строк TeX newlines и записать это в файл, который я могу затем включить в мой окончательный документ. Но когда я делаю texcount foo.tex | sed s/$/'\\\\'/ > wc.texвывод командной строки texcount, подавляется.

Как я могу получить выходные данные первой команды, которые будут отображены в терминале и переданы в sed?

Симус
источник

Ответы:

9

Вы можете использовать анонимный канал для второй команды:

texcount foo.tex | tee >(sed s/$/'\\\\'/ > wc.tex)
шутник
источник
Важной частью этого ответа является использование tee. Если вы уверены, что такие оболочки, как Bash, вы можете передать выходные данные Tee используя >(some further commands). В других оболочках вам нужно будет указать в качестве аргумента имя файла (это стандартный режим работы), а затем запустить some further commands < thatfile, а затем удалить этот файл. Или посмотрите ответ Хари ниже.
dubiousjim
тройник, тройник и тройник.
Багавадхар
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но это ничего не печатает ...
Симус
3
Вы не можете этого сделать, потому что tee отправляет свои данные в stdout и файл. Stdout - это то, что становится входом для sed. Вы могли бы добавить && cat unmodifiedв конце. Это выведет немодифицированный вывод в терминал.
KeithB
Правильная командная строка здесь будет 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
@dubiousjim Правильная точка с запятой - труба работает, но точка с запятой лучше выражает то, что задумано.
Дэнни Стейпл
6

Вы можете использовать довольно идиоматический

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

/dev/tty магическое устройство, которое относится к управляющему терминалу текущего процесса.

Хари
источник