Eu apenas faria comandos separados para encontrar os arquivos e depois 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
Eu tenho um projeto em C com muitos cabeçalhos e arquivos de origem. Nestes arquivos eu tenho uma linha de comentário para a versão do programa. Algo como:
/**
* all the file info and stuff....
* VER: 0.01
* rest of comments
*/
//code ....
Eu quero editar recursivamente a versão em todas as subpastas do projeto. Alguns dos arquivos têm essa linha e outros não. Como fazer isso usando programas padrão do gnu / linux? Eu estou supondo que sed
ou grep
pode ajudar!
Eu apenas faria comandos separados para encontrar os arquivos e depois 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
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 quer 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/' {} \;
(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/'
shopt -s globstar
sed -i 's/VER: [0-9].*/VER: 1.42/' **/*.[hc]
sed -i 's/VER: [0-9].*/VER: 1.42/' **/*.[hc]
Tags grep text-processing sed