Como concatenar stdin a uma string, assim?
echo "input" | COMMAND "string"
e pegue
inputstring
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"
pbpaste | awk '{print "http://dx.doi.org/"$1}'
e obtenhohttp://dx.doi.org/10.1098/rsif.2012.0125
'{print $0"string"}'
para pegar a coisa toda.string
a cada linha. Experimenteecho 'input'\n'another line' | awk '{print $0"string"}'
.use
cat -
para ler de stdin e colocá-lo$()
para descartar a nova linha finalNo entanto, por que você não solta o tubo e pega a saída do lado esquerdo em uma substituição de comando:
fonte
Costumo usar pipes, então essa tende a ser uma maneira fácil de prefixar e sufocar stdin:
fonte
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:
No seu exemplo:
fonte
Existem algumas maneiras de fazer isso, eu pessoalmente acho que a melhor é:
Outra pode ser substituindo "$" (caractere de fim de linha) por "string" em um comando sed:
Por que eu prefiro o primeiro? Porque ele concatena uma string para stdin instantaneamente, por exemplo, com o seguinte comando:
você obtém imediatamente a primeira saída:
e depois de 5 segundos você obtém o outro eco:
Por outro lado, usando "sed" primeiro ele executa todo o conteúdo do parêntese e depois dá para "sed", então o comando
irá imprimir ambas as linhas
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.
fonte
Eu sei que isso está alguns anos atrasado, mas você pode fazer isso com a opção xargs -J:
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:
Você poderia fazer:
fonte
-J
que não parece ser padrão / comum. No Linux (de ondexargs
está parteGNU findutils
), recebo o erro: Emxargs: 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
chamadasecho
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:
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 '`'.
fonte
echo input $(COMMAND "string")
, em vez de crases. Boa sorte a todos.gato será minha escolha:
ls | cat - <(echo new line)
fonte
Também funciona:
Gerará strings como:
...
fonte