ファイヤープロジェクト
sedからperlへの移行
2007-09-23T23:00+09:00   matsu
恥かしながら,私はsedは置換くらいしか用途をしらない.ということで,Perlで置換してみる.
sedといえば置換. 枠組は
何か標準出力 | sed -e '
s/パターン/置換文字/g;
'
だろうか. perlなら
何か標準出力 | perl -e '
foreach (<>) {
  $_ =~ s/パターン/置換文字/g;
  print $_;
}'
perlだとprintする手間が増えているが,複数置換してもprint回数は1回なのであんまり問題ではない. メールヘッダのDateの曜日をsedで置換してみる.
$ grep -h Date ~/Mail/spam/* | head | sed -e '
  s/Mon/getu/g;
  s/Tue/ka/g;
  s/Wed/sui/g;
  s/Thu/moku/g;
  s/Fri/kin/g;
  s/Sat/do/g;
  s/Sun/niti/g;
'
Date: kin, 14 Sep 2007 01:31:52 +0900
Date: niti, 16 Sep 2007 16:18:34 -0400
Date: moku, 20 Sep 2007 19:52:37 -0300
Date: do, 22 Apr 2006 17:24:38 -0900
Date: moku, 20 Sep 2007 18:13:18 -0700
Date: moku, 20 Sep 2007 23:33:21 -0600
Date: kin, 21 Sep 2007 12:34:13 +0900
Date: moku, 20 Sep 2007 22:13:03 -0800
Date: kin, 21 Sep 2007 13:26:26 +0900
Date:   kin, 21 Sep 2007 01:23:41 -0500
perlでやってみる.
$ grep -h Date ~/Mail/spam/* | head | perl -e '
foreach (<>) {
  $_=~s/Mon/getu/g;
  $_=~s/Tue/ka/g;
  $_=~s/Wed/sui/g;
  $_=~s/Thu/moku/g;
  $_=~s/Fri/kin/g;
  $_=~s/Sat/do/g;
  $_=~s/Sun/niti/g;
  print $_;
}'
Date: kin, 14 Sep 2007 01:31:52 +0900
Date: niti, 16 Sep 2007 16:18:34 -0400
Date: moku, 20 Sep 2007 19:52:37 -0300
Date: do, 22 Apr 2006 17:24:38 -0900
Date: moku, 20 Sep 2007 18:13:18 -0700
Date: moku, 20 Sep 2007 23:33:21 -0600
Date: kin, 21 Sep 2007 12:34:13 +0900
Date: moku, 20 Sep 2007 22:13:03 -0800
Date: kin, 21 Sep 2007 13:26:26 +0900
Date:   kin, 21 Sep 2007 01:23:41 -0500
sedが7行でperlが9行("}"のみの行はノーカウントで). しかも置換文もsedの方が単純. うーん,単純な置換だけなら,sedの方が楽か.
パターンの箇所を複数に分割し,マッチした箇所を入れ換えるような処理はsedではできない(たぶん). で,Perlだと,パターンを()でくくることで,パターンの部分を特定でき,しかもそれを置換文字列に指定できるので,簡単にできる. メールヘッダのDateの行で,年月日を行頭に移動してみる.
$ grep -h Date ~/Mail/spam/* | head | perl -e '
foreach (<>) {
  $_=~s/^([^ ]+ [^ ]+ )([^ ]+ )([^ ]+ )([^ ]+ )/$4$3$2$1/g;
  print $_;
}'
2007 Sep 14 Date: Fri, 01:31:52 +0900
2007 Sep 16 Date: Sun, 16:18:34 -0400
2007 Sep 20 Date: Thu, 19:52:37 -0300
2006 Apr 22 Date: Sat, 17:24:38 -0900
2007 Sep 20 Date: Thu, 18:13:18 -0700
2007 Sep 20 Date: Thu, 23:33:21 -0600
2007 Sep 21 Date: Fri, 12:34:13 +0900
2007 Sep 20 Date: Thu, 22:13:03 -0800
2007 Sep 21 Date: Fri, 13:26:26 +0900
sedで(たぶん)できない処理を,Perlでは簡単にできた...
matsu(C)
Since 2002
Mail to matsu