Відповіді:
Трохи Hacky, але це може бути самий короткий шлях , щоб зробити те , що ви просили в цьому питанні (використовуйте трубку , щоб прийняти 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"
'{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"
Чому я віддаю перевагу колишньому? Оскільки він об'єднує рядок, щоб 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"
А так як це xargs, ви можете зробити це на декількох рядках файлу одночасно. Якщо файл 'імена' має три рядки, наприклад:
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, який не дасть результатів, які ви шукаєте, якщо COMMAND спочатку не надрукував вміст свого stdin, а потім роздрукував його аргументи командного рядка.
Схоже, те, що ви хочете зробити, є більш близьким до заміни команд.
http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution
З підстановкою команд у вас може бути такий командний рядок:
echo input `COMMAND "string"`
Це спочатку оцінить COMMAND за допомогою "string" як вхідного даних, а потім розширить результати виконання цих команд на рядок, замінивши те, що між символами '' '.
echo input $(COMMAND "string"), а не backticks. Успіхів усім.
pbpaste | awk '{print "http://dx.doi.org/"$1}'іhttp://dx.doi.org/10.1098/rsif.2012.0125