替換多個文件中的給定文本

替換多個文件中的給定文本

我有一個包含許多頭文件和源文件的 C 項目。在這些文件中,我有一個程式版本的註解行。就像是:

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

//code ....

我想遞歸地編輯專案的所有子資料夾中的版本。有些文件有這一行,有些則沒有。如何使用標準 gnu/linux 程式來做到這一點?我猜sedgrep可以幫忙!

答案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

相關內容