Как конкатенировать stdin и строку?

Как связать stdin с строкой, например?

echo "input" | COMMAND "string"

и получим

inputstring

Ответ 1

Немного взломанный, но это может быть самый короткий способ сделать то, что вы задали в вопросе (используйте трубку для принятия stdout от echo "input" как stdin к другому процессу/команде:

echo "input" | awk '{print $1"string"}'

Вывод:

inputstring

Какую задачу вы пытаетесь выполнить? Больше контекста может помочь вам в более эффективном решении.

Обновление - ответ на комментарий:

@NoamRoss

Чем больше идиоматический способ делать то, что вам нужно, тем ниже:

echo 'http://dx.doi.org/'"$(pbpaste)"

Синтаксис $(...) называется заменой команд. Короче говоря, он выполняет команды, заключенные в новую подоболочку, и заменяет вывод stdout на то, где $(...) был вызван в родительской оболочке. Таким образом, вы получите, по сути:

echo 'http://dx.doi.org/'"rsif.2012.0125"

Ответ 2

используйте cat - для чтения из stdin и поместите его в $(), чтобы выбросить конечную новую строку

echo input | COMMAND "$(cat -)string"

Однако почему бы вам не отбросить канал и захватить вывод левой стороны в подстановке команд:

COMMAND "$(echo input)string"

Ответ 3

Я часто использую каналы, так что это простой способ добавить префикс и суффикс stdin:

echo -n "my standard in" | cat <(echo -n "prefix... ") - <(echo " ...suffix")
prefix... my standard in ...suffix

Ответ 4

Вы можете сделать это с помощью sed:

seq 5 | sed '$a\6'
seq 5 | sed '$ s/.*/\0 6/'

В вашем примере:

echo input | sed 's/.*/\0string/'

Ответ 5

Есть несколько способов добиться этого, я лично считаю, что лучше всего:

echo input | while read line; do echo $line string; done

Другой может быть, заменив "$" (конец строки) на "string" в команде sed:

echo input | sed "s/$/ string/g"

Почему я предпочитаю первое? Поскольку он мгновенно объединяет строку в stdin, например, со следующей командой:

(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 секунд.

Это может быть очень полезно в случаях, когда вы выполняете вызовы функций, которые занимают много времени, и вы хотите постоянно обновлять информацию о выходе функции.

Ответ 6

Я знаю, что это несколько лет спустя, но вы можете выполнить это с помощью опции xargs -J:

echo "input" | xargs -J "%" echo "%" "string"

И поскольку это xargs, вы можете сделать это сразу на нескольких строках файла. Если имя файла имеет три строки, например:

Adam
Bob
Charlie

Вы можете сделать:

cat names | xargs -n 1 -J "%" echo "I like" "%" "because he is nice"

Ответ 7

Команда, которую вы отправили, будет использовать строку "input" в качестве потока COMMAND stdin, который не даст результатов, которые вы ищете, если COMMAND сначала не распечатало содержимое своего stdin, а затем распечатало аргументы командной строки.

Кажется, что вы хотите сделать, ближе к подстановке команд.

http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution

При подстановке команд у вас может быть такая командная строка:

echo input `COMMAND "string"`

Сначала будет оцениваться COMMAND с "string" в качестве входных данных, а затем развернуть результаты выполнения этих команд на строку, заменив что-то между "символами".

Ответ 8

Также работает:

seq -w 0 100 | xargs -I {} echo "string "{}

Будет генерировать строки вроде:

string 000
string 001
string 002
string 003
string 004

...