Замена заданного текста в нескольких файлах

Замена заданного текста в нескольких файлах

У меня есть проект на C с множеством заголовочных и исходных файлов. В этих файлах у меня есть строка комментария для версии программы. Что-то вроде:

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

//code ....

Я хочу рекурсивно редактировать версию во всех подпапках проекта. В некоторых файлах есть эта строка, а в некоторых нет. Как это сделать с помощью стандартных программ gnu/linux? Я предполагаю sedили grepмогу помочь!

решение1

Попробуй это

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

Если вы не хотите заморачиваться с созданием .bak (файла резервной копии), вы можете немного упростить:

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

Или этоxargs+grepверсия

(не работает с файлами, в имени которых есть пробел)

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]

решение2

Я бы просто сделал отдельные команды для поиска файлов и их последующей замены.

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

Связанный контент