大量のテキストファイルを置換するというお話

なんちゃってエンジニアな私です、ども。

先日、サーバリプレイスの一貫で、大量のメタファイルを書き換える必要が出てきたんですね。そのメタファイルはXMLなテキストファイルなので、置換そのものは用意に行えるわけなんですけど、その数が1万とかぬかしやがるんで、こりゃ手動じゃ無理だなと。

というわけで、まずは修正が必要なファイルをリストアップするところからスタート。

$ locate *.extension

してファイルのリストアップ。それをリダイレクトして

$ locate *.extension > list.txt

これでリストアップしたファイルが出来上がった。このlist.txtには修正対象のファイルがズラッとフルパスで並んでいるので、このファイルを使って置換を行なっていこうという算段。

perlで置換するプログラムを書いても良かったんですが、それはそれで面倒だということで、コマンドラインから一発修正したいなと。

というわけで、ここで登場するはsedです。sedなんて使うの何年ぶりかしら・・・。sed の引数にファイル名を渡すと、それが入力ファイルとなるので、生成したlist.txtの行頭にsedコマンドを書き込むという事を考えます。

$ sed –e “s/^/sed –e /置換条件文字列/置換文字列//g” list.txt

なんて、一見わかりにくいことを書いてみたわけです。これでlist.txtの行頭にsedのコマンドが書き込まれるかと思ったら・・・、sedの出力は標準出力でした。涙

そのままファイルに保存して欲しい場合は、-iオプションを付けるらしい。そんなのあったのか。

というわけで、こうなりました

$ sed –i –e “s/^/sed –i –e ”s/置換条件文字列/置換文字列/g”/g” list.txt

※ 記憶の片隅のことを書いてるので間違ってるかもしれない。

後は、list.txtの先頭を #!/bin/sh とかにして、list.sh とかにリネームして、実行してあげると幸せになれたんですね。1台のサーバだけは。

実は同じ作業を別のサーバでもしないといけなかったのですが、うまくいきませんでした。理由は、

sed に iオプションが実装されていなかった

どんだけ古いシステムなんだよ・・・。まぁー、iオプションの存在を知らなかった私ですから、やっぱ昔はiオプションとかなかったんだよね!と開き直るわけです。

じゃ、代わりにどうしたかというと。たしか似たようなことは、perlでも出来たよなと思い出し、調べてみた。perlのワンライナーという機能を使うらしい。

うーん、perlのワンライナーっていつ頃から実装されたんだっけか。5.6あたり?

というわけで、sedの代わりにperlのワンライナーを使って、やりたいことは出来た。

perl覚えておくといざというときに便利だね。