Respostas:
Um pouco hacky, mas esta pode ser a maneira mais curta de fazer o que você perguntou na pergunta (use um pipe para aceitar stdout
de echo "input"
como stdin
para outro processo / comando:
echo "input" | awk '{print $1"string"}'
Resultado:
inputstring
Que tarefa você está tentando realizar exatamente? Mais contexto pode direcionar você para uma solução melhor.
Atualizar - respondendo ao comentário:
@NoamRoss
A maneira mais idiomática de fazer o que você quer é:
echo 'http://dx.doi.org/'"$(pbpaste)"
A $(...)
sintaxe é chamada de substituição de comando . Resumindo, ele executa os comandos incluídos em um novo subshell e substitui sua stdout
saída por onde $(...)
foi invocado no shell pai. Então você obteria, de fato:
echo 'http://dx.doi.org/'"rsif.2012.0125"
'{print $0"string"}'
para pegar a coisa toda.
string
a cada linha. Experimente echo 'input'\n'another line' | awk '{print $0"string"}'
.
use cat -
para ler de stdin e colocá-lo $()
para descartar a nova linha final
echo input | COMMAND "$(cat -)string"
No entanto, por que você não solta o tubo e pega a saída do lado esquerdo em uma substituição de comando:
COMMAND "$(echo input)string"
Costumo usar pipes, então essa tende a ser uma maneira fácil de prefixar e sufocar stdin:
echo -n "my standard in" | cat <(echo -n "prefix... ") - <(echo " ...suffix")
prefix... my standard in ...suffix
pipe
ecat
echo "my standard in" | echo -e "prefix\n$(cat -)\nsuffix"
:? Ou, a versão mais legível:echo "my standard in" | printf "%s\n%s\n%s\n" "prefix" "$(cat -)" "suffix"
Você pode fazer isso com sed:
seq 5 | sed '$a\6'
seq 5 | sed '$ s/.*/\0 6/'
No seu exemplo:
echo input | sed 's/.*/\0string/'
Existem algumas maneiras de fazer isso, eu pessoalmente acho que a melhor é:
echo input | while read line; do echo $line string; done
Outra pode ser substituindo "$" (caractere de fim de linha) por "string" em um comando sed:
echo input | sed "s/$/ string/g"
Por que eu prefiro o primeiro? Porque ele concatena uma string para stdin instantaneamente, por exemplo, com o seguinte comando:
(echo input_one ;sleep 5; echo input_two ) | while read line; do echo $line string; done
você obtém imediatamente a primeira saída:
input_one string
e depois de 5 segundos você obtém o outro eco:
input_two string
Por outro lado, usando "sed" primeiro ele executa todo o conteúdo do parêntese e depois dá para "sed", então o comando
(echo input_one ;sleep 5; echo input_two ) | sed "s/$/ string/g"
irá imprimir ambas as linhas
input_one string
input_two string
após 5 segundos.
Isso pode ser muito útil nos casos em que você está realizando chamadas para funções que levam muito tempo para serem concluídas e deseja ser continuamente atualizado sobre a saída da função.
Eu sei que isso está alguns anos atrasado, mas você pode fazer isso com a opção xargs -J:
echo "input" | xargs -J "%" echo "%" "string"
E como é xargs, você pode fazer isso em várias linhas de um arquivo de uma vez. Se o arquivo 'nomes' tiver três linhas, como:
Adam
Bob
Charlie
Você poderia fazer:
cat names | xargs -n 1 -J "%" echo "I like" "%" "because he is nice"
-J
que não parece ser padrão / comum. No Linux (de onde xargs
está parte GNU findutils
), recebo o erro: Em xargs: invalid option -- 'J'
qual sistema isso está?
-J
é para a versão Mac. Para Linux -I
executa a mesma função.
cat names | xargs -I% echo "I like % because he is nice"
IOW: não há necessidade de -n 1
( xargs
chamadas echo
uma vez por linha de entrada de qualquer maneira, pois -I
implica -L1
). Além disso, todas as citações de argumentos separadas parecem ser redundantes.
O comando postado pegaria a string "input" e a usaria como fluxo stdin de COMMAND, o que não produziria os resultados que você está procurando, a menos que COMMAND primeiro imprimisse o conteúdo de seu stdin e depois imprimisse seus argumentos de linha de comando.
Parece que o que você quer fazer está mais próximo da substituição de comandos.
http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution
Com a substituição de comando, você pode ter uma linha de comando como esta:
echo input `COMMAND "string"`
Isso avaliará primeiro COMMAND com "string" como entrada e, em seguida, expandirá os resultados da execução dos comandos em uma linha, substituindo o que está entre os caracteres '`'.
echo input $(COMMAND "string")
, em vez de crases. Boa sorte a todos.
pbpaste | awk '{print "http://dx.doi.org/"$1}'
e obtenhohttp://dx.doi.org/10.1098/rsif.2012.0125