2010年8月19日木曜日

「sed」マジくそやべぇ!(おげれつ) 〜 メールヘッダーの「From:」からメアドだけを切り出すには?

procmailでメールを処理する時に、どうしてもメールヘッダーの「From:」行からメールアドレスだけを切り出す必要が出てきた。

よくよく考えると「From:」行は意外と複雑で、次の4パターンあることがわかった。

ケース1:From: address
ケース2:From: <address>
ケース3:From: 名前 <address>
ケース4:From: address (コメント)

普通に考えて、正規表現を使うことになる。javaやas3などのプログラミング言語でやるなら大したことはないけれど、procmailでas3は当然使えないし、javaを呼ぶなど重すぎるし、perlも何か違う気がする。何とかコマンドラインツールだけでやりたい・・・と思いあぐねていたところ「sed」を思い出した。

「sed」は知ってはいたものの、一度も使ったことがなかった。しかし恐らく、今回はコレしかない。こちらを参考に、何とかやってみることにした。
【 文字列を置換する「sed」 】 - シェル・スクリプト・リファレンス:ITpro

ケース1はprocmailで普通に切り出せるのでOK。

ケース2とケース3はこうした。
# echo "<foo@bar.co.jp>" | sed -e "s/.*<\(.*\)>.*/\1/g"
foo@bar.co.jp
# echo "=?ISO-2022-JP?B?GyRCJWElIiVJGyhC?=  <foo@bar.co.jp>" | sed -e "s/.*<\(.*\)>.*/\1/g"
foo@bar.co.jp
ケース4はこうした。
# echo "foo@bar.co.jp (Tekito Comment)" | sed -e "s/\(^.*\) (.*)/\1/g"
foo@bar.co.jp
なんと!プログラムを書かなくても、たったこれだけの文字数で目的を果たせるではないか!

「sed」マジやべぇ!くそやべぇ!マジくそやべぇ!

やっぱりUNIXのコマンドラインツールはシンプルで柔軟で強力だなぁ。ソフトウェアの鏡だ。