替换多个文件中的给定文本

替换多个文件中的给定文本

我有一个包含许多头文件和源文件的 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/'

或者使用bash 全局星形递归

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

相关内容