Ответы:
Немного хакерский, но это может быть самый короткий способ сделать то, что вы задали в вопросе (используйте канал для принятия stdoutот echo "input"as stdinк другому процессу / команде:
echo "input" | awk '{print $1"string"}'
Вывод:
inputstring
Какую задачу вы конкретно пытаетесь выполнить? Более подробный контекст поможет вам найти лучшее решение.
Обновление - ответ на комментарий:
@NoamRoss
Тогда более идиоматический способ сделать то, что вы хотите:
echo 'http://dx.doi.org/'"$(pbpaste)"
$(...)Синтаксис называется подстановка команд . Короче говоря, он выполняет команды, заключенные в новую подоболочку, и заменяет свой stdoutвывод там, где $(...)был вызван в родительской оболочке. Таким образом, вы получите:
echo 'http://dx.doi.org/'"rsif.2012.0125"
'{print $0"string"}'схватил все это.
stringк каждой строке. Попробуй echo 'input'\n'another line' | awk '{print $0"string"}'.
используйте cat -для чтения из stdin и вставьте его, $()чтобы выбросить завершающую новую строку
echo input | COMMAND "$(cat -)string"
Однако почему бы вам не отбросить трубу и не захватить вывод левой части подстановкой команды:
COMMAND "$(echo input)string"
Я часто использую каналы, поэтому это простой способ добавить префикс и суффикс stdin:
echo -n "my standard in" | cat <(echo -n "prefix... ") - <(echo " ...suffix")
prefix... my standard in ...suffix
pipeиcat
echo "my standard in" | echo -e "prefix\n$(cat -)\nsuffix":? Или, более читаемая версия:echo "my standard in" | printf "%s\n%s\n%s\n" "prefix" "$(cat -)" "suffix"
Вы можете сделать это с помощью sed:
seq 5 | sed '$a\6'
seq 5 | sed '$ s/.*/\0 6/'
В вашем примере:
echo input | sed 's/.*/\0string/'
Есть несколько способов добиться этого, я лично считаю, что лучший из них:
echo input | while read line; do echo $line string; done
Другой может быть заменой «$» (символ конца строки) на «строку» в команде sed:
echo input | sed "s/$/ string/g"
Почему я предпочитаю первое? Потому что он мгновенно объединяет строку со стандартным вводом, например, с помощью следующей команды:
(echo input_one ;sleep 5; echo input_two ) | while read line; do echo $line string; done
вы сразу получите первый вывод:
input_one string
а затем через 5 секунд вы получите другое эхо:
input_two string
С другой стороны, при использовании "sed" сначала выполняется все содержимое круглой скобки, а затем оно передается в "sed", поэтому команда
(echo input_one ;sleep 5; echo input_two ) | sed "s/$/ string/g"
выведет обе строки
input_one string
input_two string
через 5 секунд.
Это может быть очень полезно в тех случаях, когда вы выполняете вызовы функций, выполнение которых занимает много времени, и вы хотите постоянно получать обновления о выходе функции.
Я знаю, что это опоздание на несколько лет, но вы можете сделать это с помощью опции xargs -J:
echo "input" | xargs -J "%" echo "%" "string"
А так как это xargs, вы можете сделать это на нескольких строках файла одновременно. Если в файле name есть три строки, например:
Adam
Bob
Charlie
Вы могли сделать:
cat names | xargs -n 1 -J "%" echo "I like" "%" "because he is nice"
-Jне кажется стандартным / обычным. В Linux (где xargsэто часть GNU findutils) я получаю сообщение об ошибке: На xargs: invalid option -- 'J'какой это системе?
-Jдля версии для Mac. Для Linux -Iвыполняет ту же функцию.
cat names | xargs -I% echo "I like % because he is nice"IOW: нет необходимости в -n 1( в любом случае xargsвызывает echoодин раз для каждой строки ввода, поскольку -Iподразумевает -L1) Кроме того, все отдельные кавычки аргументов кажутся избыточными.
Опубликованная вами команда примет строку «input» и будет использовать ее как поток stdin КОМАНДЫ, который не даст результатов, которые вы ищете, если только COMMAND сначала не распечатает содержимое своего stdin, а затем распечатает аргументы командной строки.
Похоже, то, что вы хотите сделать, ближе к подстановке команд.
http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution
При подстановке команд вы можете получить такую командную строку:
echo input `COMMAND "string"`
Это сначала оценит КОМАНДУ с "строкой" в качестве входных данных, а затем развернет результаты выполнения этой команды на строку, заменив то, что находится между символами '' '.
echo input $(COMMAND "string"), а не обратные кавычки. Всем удачи.
pbpaste | awk '{print "http://dx.doi.org/"$1}'и получаюhttp://dx.doi.org/10.1098/rsif.2012.0125