概要
Unityでゲームを作っていると「このテキストカラー変えたいな」とか「イメージのグレーアウトもう少し暗くしたいな」というシチュエーションがあります。
カラー値が固有のものだとわかっているのであれば、以下のようなgrep + sedの組み合わせで置換出来ます。
git grep -l "m_Color: {r: 0.1, g: 0.1, b: 0.1, a: 1}" | xargs sed -i '' -e 's/m_Color: {r: 0.1, g: 0.1, b: 0.1, a: 1}/m_Color: {r: 0.2, g: 0.2, b: 0.2, a: 1}/g'
しかし、たまに #FFFFFF のような、別のComponentでも使っているカラーを変えたい時があります。
この場合はgrep + sedのコマンドだけでは巻き込んで置換してしまいます。
その場合は置換したいComponentのguidを置換対象にすることで、巻き込まないように置換することが出来ます。
以下は個人用のメモ。
コマンド
# 置換対象のテキストを含むファイルのリストを取得
git grep -l "m_Script: {fileID: 11500000, guid: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, type: 3}" > file_list.txt
# 置換される文字列
cat <<EOF > original_text.txt
m_Script: {fileID: 11500000, guid: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
EOF
# 置換する文字列
cat <<EOF > replaced_text.txt
m_Script: {fileID: 11500000, guid: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.9, g: 0.9, b: 0.9, a: 1}
EOF
# 置換
while IFS= read -r file; do
perl -i -p0e "s#$(cat original_text.txt)#$(cat replaced_text.txt)#g" "$file"
done < file_list.txt
メモ
- 本当はワンライナーでやりたいが複数行の対応をするのがめんどくさそうなので綺麗にわけた
- 置換したいComponentを指定するためにguidを利用する
- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXは自分が置換したいComponentのguid
- 多分Graphicを継承しているものであればこのレイアウトで行ける
- guidがわからなかったら、適当にカラー変えて保存した後、gitかなにかでdiffを取ってきたらこの近辺の行が取れる
- 多分ColorだけじゃなくてMaterialやSprite、Mesh、Fontも行ける
- perl部分はperlじゃなくてpythonとかでも出来そう