Repita todos los archivos e inserte encabezados de archivos

Repita todos los archivos e inserte encabezados de archivos

Supongamos que tengo este proyecto ficticio:

$tree -L 3 ~/my-proj
./dir/foo.sh
./bar.sh

Quiero insertar el encabezado del archivo de derechos de autor en todos los archivos *.sh, por ejemplo mi encabezado es:

/*
 *  Copyright (c) 2015 by MyCompany, Inc.
 *  All rights reserved.
 */

Estoy luchando porque es multilínea, logré escribir el siguiente script pero no funciona para multilínea:

#!/bin/sh
HEADER=$(cat<<EOH
/*
 *  Copyright (c) 2015 by MyCompany, Inc.
 *  All rights reserved.
 */
)

find ~/my-proj/*.sh -exec sed -i "1s/^/$HEADER\n/" {} \;

Respuesta1

Utilizar esta:

header='/*\n *  Copyright (c) 2015 by MyCompany, Inc.\n *  All rights reserved.\n */\n'
find ~/my-proj/*.sh -exec sed -i "1s|^|$header|" {} \;

Notas:

  1. El shell sustituirá el valor de $headerdirectamente en el comando sed. Esto permite la inyección de comandos arbitrarios en el script sed. HacernoHaga esto a menos que confíe en la fuente del archivo header.

  2. El encabezado contiene /caracteres. O esos caracteres deben tener caracteres de escape o el comando sustituto debe utilizar un delimitador diferente. En lo anterior, |se utilizó como delimitador.

  3. Es una buena práctica utilizar minúsculas o mayúsculas mixtas para las variables del shell. El sistema utiliza mayúsculas para sus variables y, si bien no es un problema en este caso, no querrás sobrescribir una accidentalmente.

Ejemplo

Para ilustrar el comando sed revisado, considere este archivo de prueba:

$ cat file
1
2
3

El comando sed produce:

$ sed "1s|^|$header|" file
/*
 *  Copyright (c) 2015 by MyCompany, Inc.
 *  All rights reserved.
 */
1
2
3

información relacionada