Respuestas:
Un poco hacky, pero esta podría ser la forma más corta de hacer lo que preguntó en la pregunta (use una tubería para aceptar stdout
desde echo "input"
como stdin
a otro proceso / comando:
echo "input" | awk '{print $1"string"}'
Salida:
inputstring
¿Qué tarea estás tratando de realizar exactamente? Más contexto puede brindarle más orientación hacia una mejor solución.
Actualización - respondiendo al comentario:
@NoamRoss
La forma más idiomática de hacer lo que quiere es entonces:
echo 'http://dx.doi.org/'"$(pbpaste)"
La $(...)
sintaxis se llama sustitución de comandos . En resumen, ejecuta los comandos incluidos en una nueva subcapa y sustituye su stdout
salida por donde $(...)
se invocó en la shell principal. Entonces obtendría, en efecto:
echo 'http://dx.doi.org/'"rsif.2012.0125"
'{print $0"string"}'
agarrarlo todo.
string
a cada línea. Prueba echo 'input'\n'another line' | awk '{print $0"string"}'
.
use cat -
para leer desde stdin, y colóquelo $()
para deshacerse de la nueva línea final
echo input | COMMAND "$(cat -)string"
Sin embargo, ¿por qué no suelta la tubería y toma la salida del lado izquierdo en una sustitución de comando?
COMMAND "$(echo input)string"
A menudo uso tuberías, por lo que esta suele ser una forma fácil de prefijar y sufijar stdin:
echo -n "my standard in" | cat <(echo -n "prefix... ") - <(echo " ...suffix")
prefix... my standard in ...suffix
pipe
ycat
echo "my standard in" | echo -e "prefix\n$(cat -)\nsuffix"
:? O, la versión más legible:echo "my standard in" | printf "%s\n%s\n%s\n" "prefix" "$(cat -)" "suffix"
Puedes hacerlo con sed:
seq 5 | sed '$a\6'
seq 5 | sed '$ s/.*/\0 6/'
En tu ejemplo:
echo input | sed 's/.*/\0string/'
Hay algunas formas de lograr esto, personalmente creo que la mejor es:
echo input | while read line; do echo $line string; done
Otro puede ser sustituyendo "$" (carácter de fin de línea) con "cadena" en un comando sed:
echo input | sed "s/$/ string/g"
¿Por qué prefiero el primero? Porque concatena una cadena a stdin instantáneamente, por ejemplo con el siguiente comando:
(echo input_one ;sleep 5; echo input_two ) | while read line; do echo $line string; done
obtienes inmediatamente la primera salida:
input_one string
y luego, después de 5 segundos, obtienes el otro eco:
input_two string
Por otro lado usando "sed" primero realiza todo el contenido del paréntesis y luego le da a "sed", entonces el comando
(echo input_one ;sleep 5; echo input_two ) | sed "s/$/ string/g"
dará salida a ambas líneas
input_one string
input_two string
después de 5 segundos.
Esto puede ser muy útil en los casos en que esté realizando llamadas a funciones que demoren mucho en completarse y desee estar actualizado continuamente sobre el resultado de la función.
Sé que esto tiene un retraso de algunos años, pero puede lograrlo con la opción xargs -J:
echo "input" | xargs -J "%" echo "%" "string"
Y como es xargs, puede hacer esto en varias líneas de un archivo a la vez. Si el archivo 'nombres' tiene tres líneas, como:
Adam
Bob
Charlie
Podrías hacerlo:
cat names | xargs -n 1 -J "%" echo "I like" "%" "because he is nice"
-J
que no parece ser estándar / común. En Linux (de donde xargs
forma parte GNU findutils
) aparece el error: xargs: invalid option -- 'J'
¿En qué sistema está?
-J
es para la versión Mac. Para Linux -I
realiza la misma función.
cat names | xargs -I% echo "I like % because he is nice"
IOW: no es necesario el -n 1
( xargs
llamadas echo
una vez por línea de entrada de todos modos, ya que -I
implica -L1
) Además, todas las citas de arg por separado parecen ser redundantes.
El comando que publicó tomaría la cadena "input" y la usaría como flujo stdin de COMMAND, que no produciría los resultados que está buscando a menos que COMMAND imprima primero el contenido de su stdin y luego imprima sus argumentos de línea de comando.
Parece que lo que quiere hacer está más cerca de la sustitución de comandos.
http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution
Con la sustitución de comandos, puede tener una línea de comandos como esta:
echo input `COMMAND "string"`
Esto primero evaluará COMMAND con "cadena" como entrada, y luego expandirá los resultados de la ejecución de esos comandos en una línea, reemplazando lo que está entre los caracteres '`'.
echo input $(COMMAND "string")
, en lugar de comillas inversas. Buena suerte a todos.
pbpaste | awk '{print "http://dx.doi.org/"$1}'
y obtengohttp://dx.doi.org/10.1098/rsif.2012.0125