複数のファイル内の特定のテキストを置き換える

複数のファイル内の特定のテキストを置き換える

多数のヘッダーとソース ファイルを含む 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

関連情報