2010-09-24 20 views
7

Estoy tratando de insertar cierta información de copiar al comienzo de algunos archivos fuente. Sé que usando sed de la siguiente manera:Insertar texto de un archivo al comienzo de otro archivo - bash

sed "1iSome copyrighted information." sample.txt 

insertaría el texto "Parte de la información con derechos de autor" al comienzo de sample.txt.
Necesito insertar texto de un archivo al comienzo de sample.txt. ¿Hay alguna forma en la SED que podría utilizar un comando cat para la finalidad anteriormente mencionada, decir algo como lo siguiente ?:

sed "1i{cat header.txt}" sample.txt 

He buscado en Google para el anterior y no han encontrado exactamente lo que he estado buscando. Cualquier ayuda sobre esto es bienvenida.

Gracias.

Respuesta

8

Uso editor de texto ed:

echo -e '0r header.txt\nw' | ed sample.txt 

o usar vi/ex comando:

vi - +'0r header.txt|wq' sample.txt 

Pero no veo ninguna forma de ejecutar un comando en sed.

+0

gracias! Esto funcionó muy bien. – Sriram

4
cat header.txt sample.txt > temp.txt 
mv temp.txt sample.txt 
+0

que pondrá el encabezado debajo de la muestra – ghostdog74

+0

bien ... pero ¿hay una manera más simple de hacerlo, quizás con sed? – Sriram

+1

Esto agregará sampte.txt a header.txt. El orden es correcto Después de tu comentario lo intenté de nuevo. Funciona. – tangens

1

Si realmente quieren hacerlo usando sed:

INFO=$(cat header.txt) # read the contents of file headers.txt into var INFO 
sed -i "1i$INFO" sample.txt # insert $INFO, use -i to change the file inplace 

Me gustaría sin embargo utilizar el método basado cat.

+1

Creo que este método no funcionaría si tu encabezado contiene algunas cadenas que sed interprete como un comando. – tangens

+0

tangens tiene razón, eso no funciona. header.txt contiene información en forma de comentarios estilo C (/ * y * /) que sed interpreta como un comando. – Sriram

0

¿Por qué no hacer esto al revés, p. agregar sus archivos de origen a su archivo de derechos de autor?

El comando 'cat' es en realidad la abreviatura de 'concatenar', se puede decir simplemente

for f in *.c 
do 
    cp $f /tmp 
    cat copyright.txt /tmp/$f >$f 
done 
+0

Tiene un gran problema de limpieza en/tmp, ¡y eso supone que no está trabajando en/tmp en primer lugar! –

+1

No realmente, para eso/tmp es. Si está contento de que lo haga, si no lo está, tiene garantizado que puede deshacer el cambio. – Gaius

8

Si tiene GNU sed:

sed -i -e '2{x;G};1{h;rheader.txt' -e 'd}' sample.txt 

sample.txt debe contener al menos dos líneas.

Este método funciona incluso si el archivo de encabezado contiene caracteres que son especiales para sed.

Explicación:

  • -i - editar el archivo en lugar
  • -e - romper la secuencia de comandos en secciones - esto es necesario en este caso para delimitar el final del nombre de archivo de cabecera (que también se podrían delimitada por un salto de línea)
  • 1{h; - en la primera línea del archivo (sample.txt) guardarlo para mantener el espacio
  • rheader.txt - leer en el archivo de cabecera (cabecera.txt)
  • d} - borrar la primera línea original del archivo del espacio de patrones y procesamiento final de la línea 1 - eliminarlo aquí impide una línea en blanco se inserte en el principio del archivo
  • contenido del archivo
  • la cabecera son ahora salida
  • 2{x; - cuando se lee la línea 2 del archivo (sample.txt), intercambiar en espacio de bodega y espacio de bodega swap (que contiene la línea original 1) en el espacio patrón
  • G} - anexar espacio de bodega en el fin del espacio del patrón (que ahora contiene las líneas originales 1 y 2) y procesamiento completo de la línea 2
  • las líneas 1 y 2 se envían ahora y luego continúa el proceso para el resto del archivo, que consiste simplemente en leer y generar cada línea.

Editar: quité un comando superflua de la versión I Iniciado.

+1

Una explicación de cómo funciona esto será genial :) – codaddict

+2

@codaddict: Lo tienes. –

+0

¿cómo aplicaría recursivamente [con la condición] a todos los archivos de una carpeta? por ejemplo: 'para todas las subcarpetas/archivos en. : si el archivo es * .c entonces SED_CMD' ?? – bny

8

Lo sentimos utilizar una respuesta entera - por el simple hecho de formatear :) Básicamente, la misma respuesta de @tangens, pero sin el archivo temporal:

echo "$(cat header.txt sample.txt)" > sample.txt 

Nota las comillas (") para preservar los finales de línea, y el hecho de que la concatenación cat se ejecuta en un subproceso - por lo que no debería existir la posibilidad de sobrescribir un archivo (el sample.txt) que está abierto para lectura ..

Saludos!

Cuestiones relacionadas