Strange Days

久々にawkでやっつけ仕事

2003年02月04日(火曜日) 00時00分 コンピュータ 天気:晴れ気味(のち曇り気味)

 今年に入って、日記にリンクした画像データは、全てairnetサイトに置くようにしたのだが、気づいたろうか。bigサイトの容量100MBがほぼ一杯になったので、大きな部分を占める画像データだけでも引っ越す必要が生じたのだ。airnetは、転送量こそ毎月5GBの縛りはあるが(これ以上の状態が続くと高額の転送料を取られる)、ウェブページ容量は必要なだけ、25MB単位で拡張してくれるので、こういうあまり参照されることの無い、しかしサイズの大きいデータを置くには適している。airnetにも日記を置いているので、airnetサイトから参照できるファイルしか置けないという縛りも、この場合は問題無いだろう。ということで、とりあえず今年に入ってからの新規分はairnetに移した。しかし、2002年以前のデータは未着手だ。
 2002年分の画像ファイルを調べると、15MB強ある。これを移せば、bigの方はまだしばらくはなんとか出来そうだ。そこで、2002年分の日記ファイルのリンク部分を、airnetへと書き換えなければならない。
 こういう仕事はsedで一発だ、と思ったのだが、Win32環境でロングネームを考慮したsedは見当たらない。じゃあLinuxならという事になるが、こちらはシェルスクリプトの経験が無いので、DOSの世界でのfor in do相当の処理が分からない(foreachを使うのだろうか)。中途半端な知識しかないと、こういうときに困る。
 幸い、Win32環境でロングネームも扱えるawkはあったので、こいつでなんとかしようと思った。
 ファイルを一つ一つ渡すのはfor in doで大丈夫だから、そのファイルの該当部分を書き換えればいいのだ。楽勝だ、とその時は思った。ところが、それをどうやって実現するか、直感できない自分に愕然とした。awkをすっかり忘れてしまっている。ここ何年も使わなかったからな。どういう関数で文字列を置き換えるかさえも忘れている。いくらなんでも忘れすぎである。
 幸い、昔自分で組んだスクリプトがたくさん残っていたので、それを読み解きながら思い出していった。やりたいことは、渡されたファイルを別ファイルに出力しながら、特定文字列を置き換えることだけだ。しかし、最初は別ファイルへの出力のやり方を思い出せなかったので、なんだか予想以上に長いスクリプトになりそうな予感がした。というか、いまいち分からない。いっそ、javaで組んじまおうか。
 こういう時は実験君です。というわけで、かつて組んだスクリプトを参照しながら、いろいろ試してみる。あ、そういえば、ファイルへの出力って、単にリダイレクトするだけでよかったんだ。渡されたファイル名から新しいファイル名を生成する処理、特定文字列を置き換える処理、それを含めて新ファイルへとリダイレクトする処理だけでいいわけだ。結局、ほんの10行くらいで済んだではないか。いやあ、やっぱりこういうやっつけ仕事には、awkって便利。
 しかしまあ、使わないと、プログラミングの知識ってあっという間に錆び付いてしまうものだなあ。


Add Comments


____