Estoy tratando de agregar un encabezado de licencia a todos los archivos de encabezado y archivos de origen en un directorio de proyecto usando un bucle for. Esto no está funcionando, ¿hay algún otro enfoque que esté usando sed?
text-processing
shell-script
Satyendra
fuente
fuente

Respuestas:
fuente
globstarbash para que esto funcione.Esto es más o menos un comentario extenso sobre la respuesta de Daniel Serodio '' . Comencé a escribirlo como un comentario, pero rápidamente creció demasiado ...
Para que un bash glob sea recursivo, se requiere
shopt -s globstar. Debes habilitar globstar, de lo contrario**no funciona. La opción de shell globstar se introdujo en la versión 4 de bash.Para evitar el procesamiento de un directorio como
my.cpp/, use la prueba[[ -f $f ]]... Cuando la prueba está entre corchetes dobles, no es necesario que se doblen las variables.También puede considerar la posibilidad de que no haya archivos coincidentes mediante el uso
shopt -s nullglob, que permite que los patrones que no coinciden con ningún archivo se expandan a una cadena nula, en lugar de a sí mismos.Para manejar múltiples patrones, puede encadenar los patrones glob:
**/*.cpp **/*.hpero quizás de manera preferible, cuando la opción de shell extglob está activada a través deshopt -s extglob, puede usar construcciones tales como las**/*.@(cpp|h)que evitan múltiples pases sobre el sistema de archivos; una vez para cada patrón.Si desea
.filesser incluido, use.*.cppetc., o useshopt -s dotglobPara manejar de manera segura la modificación de un archivo que se está canalizando, use
spongedesde el paquetemoreutils(le ahorra la necesidad de crear su propio archivo temporal)fuente
[[puede manejar con gracia un nulo$f.unset x; [ -f $x ] && echo existsinformes "existen" ... (arreglado)**/*.@(cpp|h)por$( find . -name "*.h" -name "*.cpp")Gracias @fred, @maxmackie, @enzotib.
¿Puede por favor verificar el procedimiento que he seguido?
de lo contrario, el encabezado de la licencia se copiará varias veces.
Sugiérame un patrón para recorrer todos los encabezados y fuentes en el directorio y subdirectorios del proyecto.
No pude entender completamente lo que @fred ha sugerido.
fuente
targln=2; findln=$(sed -rne $targln'{\|// Copyright|=;q}' "$f"); if ((findln==targln));then... pero, por supuesto, más allá de todo lo demás, pruébelo primero ... PD. Es normal que el curso aquí en Unix y Linux publique tales extras en su pregunta original, no como una respuesta ...grep, agregue la-qopción agrep. Siempre agregue comillas dobles$f.Puede hacerlo con
exoedsi lo prefiere (no debe hacerlo consedlo que solicitó,sedestá diseñado para editar transmisiones,-ies una mala idea por varias razones):fuente
sed -iuna mala idea?sed -irompe enlaces simbólicos y enlaces duros, lo que resulta en un comportamiento inesperado. En el mejor de los casos, no es intuitivo, en el peor es activamente dañino.Si tiene un
header_filecontenido deseado:fuente
fuente
Blog de Gerhard Gappmeier - Cómo reemplazar recursivamente los encabezados de archivos fuente
La publicación del blog ha adjuntado un
tar.gzarchivo que contiene los archivos necesarios.Tiene un
header.templatearchivo, donde puede escribir un comentario personalizado, puede abarcar varias líneas.Tiene un
remove_header.awkscript que reemplaza los encabezados existentes con el nuevo encabezado.Para ejecutarlo:
fuente