2012-06-28 10 views
7

Estoy tratando de insertar un contenido de archivo antes de un patrón dadousando sed para insertar el contenido del archivo

Aquí está mi código:

sed -i "" "/pattern/ { 
i\\ 
r $scriptPath/adapters/default/permissions.xml" 
}" "$manifestFile" 

Se añade el camino en lugar del contenido del archivo.

¿Alguna idea?

Respuesta

20

Para insertar texto antes de un patrón, debe cambiar el espacio del patrón en el espacio de espera antes de leer en el archivo. Por ejemplo:

sed "/pattern/ { 
     h 
     r $scriptPath/adapters/default/permissions.xml 
     g 
     N 
    }" "$manifestFile" 
+0

La secuencia de comandos tiene que ser doble, de lo contrario $ scriptPath no se expandirá. ¿Podría explicar por qué N es necesario al final? – hipe

+0

@hipe El comando r solo pone en cola la lectura para su inserción en la secuencia de salida. En realidad, no lee nada hasta el final del ciclo o cuando se lee la siguiente línea. Sin N, el archivo no se insertaría hasta después de que se imprimiera el espacio del patrón, lo que lo haría funcionar como un apéndice en lugar de un inserto. Es * muy * no intuitivo. –

+0

Funciona bien para mí muchas gracias – ridan

4

Solo eliminar i\\.

Ejemplo:

$ cat 1.txt 
abc 
pattern 
def 

$ echo hello > 2.txt 

$ sed -i '/pattern/r 2.txt' 1.txt 

$ cat 1.txt 
abc 
pattern 
hello 
def 
+3

Se inserta después del patrón. ¿Cómo insertar el contenido antes? – ridan

1

que tiene algo como esto usando awk. Se ve feo, pero hizo el truco en mi prueba:

comando:

cat test.txt | awk ' 
/pattern/ { 
    line = $0; 
    while ((getline < "insert.txt") > 0) {print}; 
    print line; 
    next 
} 
{print}' 

test.txt:

$ cat test.txt 
some stuff 
pattern 
some other stuff 

insert.txt:

$ cat insert.txt 
this is inserted file 
this is inserted file 

de salida:

some stuff 
this is inserted file 
this is inserted file 
pattern 
some other stuff 
0

solución de CodeGnome no funcionan, si el patrón está en la última línea .. por lo que utiliza 3 comandos.

sed -i '/pattern/ i\ 
     INSERTION_MARKER 
     ' $manifestFile 
sed -i '/INSERTION_MARKER/r $scriptPath/adapters/default/permissions.xml' $manifestFile 
sed -i 's/INSERTION_MARKER//' $manifestFile 
Cuestiones relacionadas