2010-06-09 19 views
26

Pregunta realmente simple, ¿cómo combino echo y cat en el intérprete de comandos, estoy tratando de escribir el contenido de un archivo en otro archivo con una cadena pre-agregada?Combinando echo y cat en Unix

Si/tmp/archivo tiene el siguiente aspecto:

this is a test 

que desea ejecutar este:

echo "PREPENDED STRING" 
cat /tmp/file | sed 's/test/test2/g' > /tmp/result 

modo que/tmp/resultado es idéntico:

PREPENDED STRINGthis is a test2 

Gracias.

Respuesta

30

Esto debería funcionar:

echo "PREPENDED STRING" | cat - /tmp/file | sed 's/test/test2/g' > /tmp/result 
+3

Me gusta esta simplicidad, pero para completarla debería tener el distintivo -n en echo como se menciona en otra respuesta. – Dan

+6

Para cualquier otra persona que se pregunte acerca de '-' en' args', de las páginas man: 'Sin ARCHIVO, o cuando ARCHIVO es -, lea la entrada estándar.' – SooDesuNe

+2

La bandera '-n' no funciona todas las variantes de 'echo', pero eso es principalmente una nota histórica. – reinierpost

11

Probar:

(printf "%s" "PREPENDED STRING"; sed 's/test/test2/g' /tmp/file) >/tmp/result 

Los paréntesis, ejecute el comando (s) dentro de un subnivel, por lo que la salida se ve como una sola corriente de los >/tmp/result redirección.

2

o simplemente utilizar solamente sed

sed -e 's/test/test2/g 
s/^/PREPEND STRING/' /tmp/file > /tmp/result 
+0

para "one-liner-ness" usa 2 '-e''s:' sed-e 's/test/test2/g' -e 's/^/PREPEND STRING /' ... ' –

+0

Esto por supuesto antepondrá la cadena a cada línea del archivo de entrada. –

+0

Que puede ser lo que se quiere. Si no, 'sed '1s/^/STRING PREPENDED /; s/test/test2/g '/ tmp/file>/tmp/result' –

0

O también:

{ echo "PREPENDED STRING" ; cat /tmp/file | sed 's/test/test2/g' } > /tmp/result 
+0

Uso inútil de 'cat', p. esto también funcionaría: '{echo" STRING PREPENDED "; sed 's/test/test2/g'; } < /tmp/file >/tmp/result' – reinierpost

0

Otra opción: suponiendo que la cadena antepuesto presente una única vez y no para cada línea:

gawk 'BEGIN {printf("%s","PREPEND STRING")} {gsub(/test/, "&2")} 1' in > out 
0

Si esto es alguna vez para enviar un correo electrónico, recuerde usar terminaciones de línea CRLF, así:

echo -e 'To: [email protected]\r' | cat - body-of-message \ 
| sed 's/test/test2/g' | sendmail -t 

Aviso del -flag -e y la \ r dentro de la cadena.

Configuración para: de esta manera, en bucle, obtendrá el envío masivo simple del mundo.