sedからperlへの移行
恥かしながら,私は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 -0500perlでやってみる.
$ 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では簡単にできた...

