Reemplazo de un texto determinado en varios archivos

Reemplazo de un texto determinado en varios archivos

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 sedo greppuedo 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

información relacionada