なんちゃってエンジニアな私です、ども。
先日、サーバリプレイスの一貫で、大量のメタファイルを書き換える必要が出てきたんですね。そのメタファイルは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覚えておくといざというときに便利だね。