Tengo un proyecto en C con muchos encabezados y archivos fuente. En estos archivos tengo una línea de comentario para la versión del programa. Algo como:
/**
* all the file info and stuff....
* VER: 0.01
* rest of comments
*/
//code ....
Quiero editar recursivamente la versión en todas las subcarpetas del proyecto. Algunos de los archivos tienen esta línea y otros no. ¿Cómo hacerlo usando programas estándar de gnu/linux? ¡Estoy adivinando sed
o grep
puedo ayudar!
Respuesta1
Prueba esto
find . -type f -name '*.[ch]' -exec bash -c '
grep -q "VER: [0-9]" "$1" && sed -i.bak "s/VER: [0-9].*/VER: 1.42/" "$1"
' -- {} \;
Si no quiere molestarse en producir un .bak (archivo de respaldo), puede simplificar un poco:
find . -type f -name '*.[ch]' -exec sed -i 's/VER: [0-9].*/VER: 1.42/' {} \;
O estoxargs+grepversión
(no trabaje con archivos con espacios en sus nombres)
grep -rl 'VER: [0-9].*' . |
grep '.*\.[ch]$' |
xargs sed -i 's/VER: [0-9].*/VER: 1.42/'
O usandofiesta globstarrecursividad
shopt -s globstar
sed -i 's/VER: [0-9].*/VER: 1.42/' **/*.[hc]
O usandozsh
sed -i 's/VER: [0-9].*/VER: 1.42/' **/*.[hc]
Respuesta2
Simplemente haría comandos separados para buscar los archivos y luego reemplazarlos.
find . -type f \(-name "*.c" -o -name "*.h" \) | xargs grep -l "VER: 0.01" > files;
for file in $(cat files);do sed -i "s/VER: 0.01/VER: 0.02/g" $file
done