Как объединить stdin и строку?



Как я могу объединить stdin в строку, как это?



echo "input" | COMMAND "string"


и вам



inputstring
495   8  

8 ответов:

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

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

выход:

inputstring

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

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

@NoamRoss

более идиоматические способ делать то, что вы хотите, то:

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

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

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

использовать cat - читать из stdin, и положил его в $(), чтобы выбросить пустую строку

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

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

COMMAND "$(echo input)string"

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

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

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

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

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

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

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

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

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

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

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

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

Adam
Bob
Charlie

вы могли бы сделать:

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

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

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

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

с заменой команд вы можете иметь командную строку, как это:

echo input `COMMAND "string"`

это сначала оценит команду с" строкой ‘ в качестве входных данных, а затем развернет результаты выполнения этой команды на строку, заменив то, что находится между символами"’.

работает:

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

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

string 000
string 001
string 002
string 003
string 004

...

Comments

    Ничего не найдено.