はじめに
どうも、さいほうへいきです。
近頃、友人のMotchiyくんのサーバーを借りてあれやこれやすることが多く、その際に非常に必要だったのがこの『ディレクトリ内のテキストを一括置き換えするコマンド』です。ところでMotchiyって誰?
複数のファイルで、それぞれ複数個所を変更するのは、さすがに一括でやらないとあまりにも手間がひどくてですね……(涙)
というわけで、一行ポチッで使える一括置き換えコマンドを半分自分用にまとめておきます。
使用上の注意
使用時はバックアップを必ず取ってください!!!!!!!!!!
重要なファイルにそのまま一括置き換えとか恐ろしすぎるのでほんとうに!!!!!!!!!!
……あとあくまで個人用メモなので、ここに書いてあるコードを使って万一なにか起きても僕は責任取れません。
一応自分の環境でざっくりテストを行ってはいますが……。
コマンド
一括置き換えコマンド
こちらが、Bashで使える一括置き換えコマンドです! やった~!
find . -type f -name "*.txt" -exec sed -i 's/old/new/g' {} +
この一行のうち、*.txtの部分でファイル名を指定でき、s/old/new/gの部分で置き換え前・置き換え後の指定ができます。
この場合だと、ディレクトリ内のすべてのtxtファイルに書かれている『old』という文字列を『new』に書き換えます。
たとえば……
I have some old toys. -> I have some new toys.
I think the older version is better. -> I think the newer version is better.
こんな感じ。
必要に合わせて、適宜書き換えて使ってください。
なお、sedでは文字列を正規表現として解釈するため、ピリオドやスラッシュなど、そう見做される文字列を置き換える場合には適切にエスケープをつかうなりなんなりしてください。
事前確認用コマンド
これ大事。マジで大事。
置き換えコマンドを使う前に、必ずこちらのコマンドで確認を行うようにしてください。
grep -rn "old" . --include="*.txt"
これはtxtファイルから『old』という文字列を探し出し、その位置と行番号を表示します。
もし一括置き換えをしよう、となった時に、予期しない部分まで置き換えられてしまうことを防ぐために、事前にチェックを行います。
たとえば上のold/newの例だと、次のような事故が起こるかもしれません。
Please hold the door open for me. -> Please hnew the door open for me.
置き換え前では『ドア開けたままにしてて!』という文なのですが、『hold』が巻き込まれてしまったせいで『hnew』なる奇々怪々のワードが爆誕してしまいました。
こんなことが発生するのを防ぐために、まずはどこに置き換え対象が隠れているのかきちんとチェックするべきです。
今回で言うなら『hold』などのワードがもし見つかれば、そこはあとあと手作業で修正するなり、そこも一括置き換えするなりで治しましょう。
まとめ
以上、ディレクトリ内のファイルを一括で置き換えるコマンドの紹介でした。
僕自身初心者なので、もしどこか間違っているところがあればご指摘いただけるとありがたいです。
では。