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:
El shell sustituirá el valor de
$header
directamente 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 archivoheader
.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.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