LoginSignup
3
4

More than 5 years have passed since last update.

プロジェクト配下のtypoをワンライナーで一括修正

Last updated at Posted at 2013-12-13

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 diffgit reset等で可能。

3
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4