例
gozillaをmozillaに直したい。
調査
カレントディレクトリ配下を検索して影響範囲を調査。
-> % find . -type f | xargs grep gozilla
./blocklist.xml:<blocklist xmlns="http://www.gozilla.org/2006/addons-blocklist">
./modules/virtualFolderWrapper.js: let rdfService = Cc['@gozilla.org/rdf/rdf-service;1']
./modules/virtualFolderWrapper.js: Cc["@gozilla.org/messenger/services/filters;1"]
./res/mathml.css: * http://www.gozilla.org/MPL/
grep -l
で修正対象ファイル名一覧を出す。
-> % find . -type f | xargs grep -l gozilla
./blocklist.xml
./modules/virtualFolderWrapper.js
./res/mathml.css
3ファイル、4箇所にわたって修正する必要がありと分かる。
修正
PerlのIn-place editオプション-i
を使って一括修正。
元ファイルを.bak
という名前で残しつつ修正する。
-> % find . -type f | xargs grep -l gozilla | xargs perl -pi.bak -e 's/gozilla/mozilla/'
実行後はこのような感じになっている。
./blocklist.xml
./blocklist.xml.bak
./modules/virtualFolderWrapper.js
./modules/virtualFolderWrapper.js.bak
./res/mathml.css
./res/mathml.css.bak
確認
バックアップ用拡張子.bakを検索し、修正後の結果とdiffを取って正しく直っていることを確認。
-> % find . -name '*.bak' | sed 's/\(.*\).bak/diff \1 &/'
sedの\1
は正規表現の後方参照用にキャプチャした文字列の1個目。
&
は正規表現にヒットした全部の文字列。つまり以下のコマンド文字列を生成している。
diff ./blocklist.xml ./blocklist.xml.bak
diff ./modules/virtualFolderWrapper.js ./modules/virtualFolderWrapper.js.bak
diff ./res/mathml.css ./res/mathml.css.bak
シェルに流して実行
-> % find . -name '*.bak' | sed 's/\(.*\).bak/diff \1 &/' | sh
実行結果
2c2
< <blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist">
---
> <blocklist xmlns="http://www.gozilla.org/2006/addons-blocklist">
159c159
< let rdfService = Cc['@mozilla.org/rdf/rdf-service;1']
---
> let rdfService = Cc['@gozilla.org/rdf/rdf-service;1']
210c210
< Cc["@mozilla.org/messenger/services/filters;1"]
---
> Cc["@gozilla.org/messenger/services/filters;1"]
7c7
< * http://www.mozilla.org/MPL/
---
> * http://www.gozilla.org/MPL/
左が修正後、右が修正前の(typoを含んだ)オリジナル
切り戻し
修正用のPerlの正規表現を間違えたなど、元の状態に戻したい場合。
-> % find . -name '*.bak' | sed 's/\(.*\).bak/mv & \1/'
mv ./blocklist.xml.bak ./blocklist.xml
mv ./modules/virtualFolderWrapper.js.bak ./modules/virtualFolderWrapper.js
mv ./res/mathml.css.bak ./res/mathml.css
diffの時と同様、修正前のオリジナルである.bakを元ファイル名にmvするコマンド文字列を生成した後、シェルに流して実行。
-> % find . -name '*.bak' | sed 's/\(.*\).bak/mv & \1/' | sh
後始末
.bakファイルはtypo修正確認後は不要のため削除。
-> % find . -name '*.bak' | xargs rm
補足
Git等を使っていたらPerlのIn-place editオプション-i
は空文字指定にしておくと削除の手間が省けます。
-> % find . -type f | xargs grep -l gozilla | xargs perl -pi.bak -e 's/gozilla/mozilla/'
ではなくて
-> % find . -type f | xargs grep -l gozilla | xargs perl -pi -e 's/gozilla/mozilla/'
確認や切り戻しもgit diff
、git reset
等で可能。