2012-06-08 20 views
15

El caso de uso es, en mi caso, la concatenación de archivos CSS, antes de que se minimice. A concat dos archivos CSS:Concatenar cadenas, archivos y salida de programa en Bash

cat 1.css 2.css > out.css 

Para añadir un poco de texto en una sola posición, no puedo hacer

cat 1.css <<SOMESTUFF 2.css > out.css 
This will end in the middle. 
SOMESTUFF 

Para añadir STDOUT de uno otro programa:

sed 's/foo/bar/g' 3.css | cat 1.css - 2.css > out.css 

Hasta ahora todo bien. Pero regularmente entro en situaciones en las que necesito mezclar varias cadenas, archivos e incluso salidas de programas juntas, como encabezados de derechos de autor, archivos preprocesados ​​por sed(1) y más. Me gustaría concatenarlos juntos en pequeños pasos y archivos temporales como sea posible, a la vez que tengo la libertad de elegir el orden.

En resumen, estoy buscando una manera de hacer esto en tan pocos pasos como sea posible en Bash:

command [string|file|output]+ > concatenated 
# note the plus ;-) --------^ 

(Básicamente, tener una cat para manejar múltiples STDINs sería suficiente, supongo, como

<(echo "FOO") <(sed ...) <(echo "BAR") cat 1.css -echo1- -sed- 2.css -echo2- 

Pero no puedo ver, cómo puedo acceder a los)

Respuesta

23

Esto funciona:

cat 1.css <(echo "FOO") <(sed ...) 2.css <(echo "BAR") 
+0

D'oh! Esa es la solución más simple (en mi caso), así que lo aceptaré. – Boldewyn

+1

Por supuesto @Boldewyn debe haber agregado '> concatenated.css' o' | compiler' al final para que funcione para su problema de esta manera: 'cat file1.css <(echo" FOO ") <(command [string | file | output]) file2.css <(echo" BAR ")> concatenado ' – hobs

12

que puede hacer:.

echo "$(command 1)" "$(command 2)" ... "$(command n)" > outputFile 
+0

Es necesario citar aquellas sustituciones de comandos para conservar espacio en blanco. –

+0

@DennisWilliamson: Gracias. Arreglé mi respuesta. – nhahtdh

16

Se pueden añadir todos los comandos en un subnivel, que se redirige a un archivo:

(
    cat 1.css 
    echo "FOO" 
    sed ... 
    echo BAR 
    cat 2.css 
) > output 

También puede anexar a un archivo con >>. Por ejemplo:

cat 1.css > output 
echo "FOO" >> output 
sed ... >> output 
echo "BAR" >> output 
cat 2.css >> output 

(Potencialmente, esto abre y cierra el archivo en varias ocasiones)

+0

Puede usar un bloqueador de rizado para hacer lo mismo. –

+0

Gracias. Sí, eso lo haría, completamente perdido esa opción. +1. – Boldewyn

+0

Si no me equivoco,() es POSIX-obediente, mientras que la sustitución de comando es una extensión de bash, que no se implementó en Cygwin Bash hasta aproximadamente 2008. – Leo