Substituindo um determinado texto em vários arquivos

Substituindo um determinado texto em vários arquivos

Tenho um projeto C com muitos cabeçalhos e arquivos de origem. Nestes arquivos tenho uma linha de comentários para a versão do programa. Algo como:

/**
* all the file info and stuff....
* VER: 0.01
* rest of comments
*/

//code ....

Quero editar recursivamente a versão em todas as subpastas do projeto. Alguns dos arquivos possuem esta linha e outros não. Como fazer isso usando programas GNU/Linux padrão? Estou supondo sedou grepposso ajudar!

Responder1

Experimente isso

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"
' -- {} \;

Se você não quiser se preocupar em produzir um .bak (arquivo de backup), você pode simplificar um pouco:

find . -type f -name '*.[ch]' -exec sed -i 's/VER: [0-9].*/VER: 1.42/' {} \;

Ou istoxargs+grepversão

(não trabalhe com arquivos com espaço em seus nomes)

grep -rl 'VER: [0-9].*' . |
    grep '.*\.[ch]$' |
    xargs sed -i 's/VER: [0-9].*/VER: 1.42/'

Ou usandofesta globstarrecursão

shopt -s globstar
sed -i 's/VER: [0-9].*/VER: 1.42/' **/*.[hc]

Ou usandozsh

sed -i 's/VER: [0-9].*/VER: 1.42/' **/*.[hc]

Responder2

Eu apenas executaria comandos separados para localizar os arquivos e substituí-los.

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

informação relacionada