Pregunta Cómo concatenar stdin y una cadena?


Cómo concatenar stdin a una cadena, como esta?

echo "input" | COMMAND "string"

y obten

inputstring

76
2017-12-14 18:12


origen


Respuestas:


Un poco hacky, pero esta podría ser la forma más rápida de hacer lo que preguntaste en la pregunta (usa un tubo para aceptar stdout de echo "input" como stdin a otro proceso / comando:

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

Salida:

inputstring

¿Qué tarea estás tratando exactamente de lograr? Más contexto puede darle más instrucciones sobre una mejor solución.

Actualización: respondiendo al comentario:

@NoamRoss

La forma más idiomática de hacer lo que quieres es, entonces:

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

los $(...) la sintaxis se llama sustitución de comando. En resumen, ejecuta los comandos incluidos en una nueva subcadena y la sustituye stdout salida a donde el $(...) fue invocado en el shell padre. Entonces, obtendrías:

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

82
2017-12-14 18:24



utilizar cat - leer de stdin y ponerlo en $() tirar la nueva línea final

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

Sin embargo, ¿por qué no dejas caer la tubería y tomas la salida del lado izquierdo en una sustitución de comando?

COMMAND "$(echo input)string"

39
2017-12-14 20:51



A menudo uso tubos, por lo que esto tiende a ser una manera fácil de prefijar y sufijo stdin:

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

21
2017-10-15 03:04



Puedes hacerlo con sed:

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

En tu ejemplo:

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

9
2018-02-15 08:29



Hay algunas maneras de lograr esto, personalmente creo que lo mejor es:

echo input | while read line; do echo $line string; done

Otro puede ser mediante la sustitución de "$" (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 al instante, por ejemplo con el siguiente comando:

(echo input_one ;sleep 5; echo input_two ) | while read line; do echo $line string; done

obtienes inmediatamente el primer resultado:

input_one string

y luego de 5 segundos obtienes el otro eco:

input_two string

Por otro lado, al usar "sed" primero realiza todo el contenido del paréntesis y luego se lo da a "sed", por lo que 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 casos en los que realice llamadas a funciones que tarden mucho tiempo en completarse y quieran actualizarse continuamente sobre el resultado de la función.


8
2017-12-05 12:05



Sé que esto es unos años tarde, pero puedes lograr esto con la opción xargs -J:

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

Y dado que es xargs, puedes hacer esto en múltiples 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"

4
2017-09-29 15:50



El comando que publicaste tomaría la cadena "input" para usarla como la corriente stdin de COMMAND, que no produciría los resultados que estás buscando a menos que COMMAND primero imprima el contenido de su stdin y luego imprima sus argumentos de línea de comando.

Parece que lo que quieres hacer es 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 esa ejecución de comandos en una línea, reemplazando lo que está entre los '' 'caracteres.


3
2017-12-14 18:23



También funciona:

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

Generará cadenas como:

string 000
string 001
string 002
string 003
string 004

...


0
2018-04-01 18:31