続きです。
古いChangeLog、例えばChangeLog-9899を見ると、どうやら曜日から始まる日付の書式もあるようです。
takk@deb9:~/src/binutils-2.28/binutils$ sed -ne '/^[SMFWT12]/p' ChangeLog-9899 | shuf | head | sed 's/ .*//' Sat Sep 1999-06-03 Fri Jul 31 10:04:23 1998 Tue Jun 23 14:55:05 1998 1998-07-30 16:25 1999-05-28 Tue Mar 24 19:33:08 1998 Mon Jun 29 17:01:21 1998 Mon Oct 26 14:07:59 1998 1998-07-20 takk@deb9:~/src/binutils-2.28/binutils$
本家grep-changelogでは、書式を混在させたまま表示しているようです。
takk@deb9:~/src/binutils-2.28/binutils$ grep-changelog ChangeLog-9899 | grep '^[SMFWT12]' | shuf | head | sed 's/ .*//' Thu May 14 14:00:56 1998 Thu May 14 14:00:56 1998 Wed Jun 1999-12-26 1999-04-03 Sat Mar 28 17:39:27 1998 Thu Jan 22 16:22:55 1998 1999-04-04 Thu Oct Mon Oct 26 14:07:59 1998 takk@deb9:~/src/binutils-2.28/binutils$
検索しにくいので、自作版では、yyyy-mm-ddの形に変換したいと思います。
変換は外部コマンドを使ってやります。
dateコマンドの-dオプションを使えば、日付フォーマットを自動で解析してくれます。
takk@deb9:~$ cat t.pl open(CMD,"date -d 20180101 |"); @result = <CMD>; close(CMD); print "@result"; takk@deb9:~$ perl t.pl 2018年 1月 1日 月曜日 00:00:00 JST takk@deb9:~$
ChangeLog-9899にある書式は、これと同じですね。
takk@deb9:~$ LANG=C date -d 20180101 Mon Jan 1 00:00:00 JST 2018 takk@deb9:~$
では実験。
takk@deb9:~$ cat t.pl open(CMD,"date -d 'Mon Jan 1 00:00:00 JST 2018' |"); @result = <CMD>; close(CMD); print "@result"; takk@deb9:~$ perl t.pl 2018年 1月 1日 月曜日 00:00:00 JST takk@deb9:~$
上手く解析できました。
これを自作grep-changelogに組み込みます。
31 s/^ \t/\t/; 32 s/^ /\t/; 33 34 if(/^Mon|^Tue|^Wed|^Thu|^Fri|^Sat|^Sun/){ 35 /^(.* [12]\d\d\d)/; 36 $d = $1; 37 open(CMD,"date +%F -d '$d' |"); 38 @result = <CMD>; 39 close(CMD); 40 $newdate = "@result"; 41 chop $newdate; 42 s/^$d/$newdate/; 43 print "::$_\n"; 44 }
31行目は、どうやらChangeLog-9899の一部に書式の間違いがあるようなので、合わせるための置換です。
34行目で、先頭に曜日がある日付書式かどうか判定しています。
35行目は、行頭から西暦4桁がある位置までを$1に格納する処理です。
43行目。デバッグ用に表示しています。いずれ外します。
全文です。
takk@deb9:~/src/binutils-2.28/binutils$ cat -n my-grep-changelog.pl 1 $_ = "@ARGV"; 2 s/--(\w+-?\w+) /--$1=/g; 3 $author='.+'; 4 $text='.+'; 5 $from_date='00000000'; 6 $to_date ='99999999'; 7 8 foreach(split / /){ 9 $author=$1 if(/--author=(\S+)/); 10 $text=$1 if(/--text=(\S+)/); 11 $exclude=$1 if(/--exclude=(\S+)/); 12 $from_date=$1.$2.$3 if(/--from-date=(\d\d\d\d)\-(\d\d)\-(\d\d)/); 13 $to_date=$1.$2.$3 if(/--to-date=(\d\d\d\d)\-(\d\d)\-(\d\d)/); 14 } 15 16 if($from_date > $to_date){ 17 exit 1; 18 } 19 20 %log=(); 21 opendir(DIR,"."); 22 @files = grep { /ChangeLog.*/ } readdir(DIR); 23 closedir(DIR); 24 25 $num = 1; 26 foreach(@files){ 27 open(INFILE,"<$_"); 28 $id = ""; 29 while(<INFILE>){ 30 chomp(); 31 s/^ \t/\t/; 32 s/^ /\t/; 33 34 if(/^Mon|^Tue|^Wed|^Thu|^Fri|^Sat|^Sun/){ 35 /^(.* [12]\d\d\d)/; 36 $d = $1; 37 open(CMD,"date +%F -d '$d' |"); 38 @result = <CMD>; 39 close(CMD); 40 $newdate = "@result"; 41 chop $newdate; 42 s/^$d/$newdate/; 43 print "::$_\n"; 44 } 45 if(/^\d\d\d\d\-\d\d\-\d\d/){ 46 $title = "$_"; 47 $num=0; 48 $id = $title .':::'. $num++; 49 next; 50 } 51 if(/^ \*/){ 52 $id = $title .':::'. $num++; 53 } 54 if(/^ |^ \*|^$/ && $id ne ""){ 55 if(/$text/){ 56 $log{$id} .= "$_"; 57 $found{$id} ++; 58 } 59 next; 60 } 61 last; 62 } 63 64 close(INFILE); 65 } 66 67 foreach(sort keys %log){ 68 $id = $_; 69 /^(....).(..).(..)/; 70 $dt = $1.$2.$3; 71 @tmp = split /\t/,$log{$_}; 72 73 next if($dt < $from_date); 74 next if($dt > $to_date); 75 76 if($found{$id} > 0){ 77 if($id =~ /$author/){ 78 print "$id\n"; 79 foreach(@tmp){ 80 print" $_\n"; 81 } 82 print"\n"; 83 } 84 } 85 } takk@deb9:~/src/binutils-2.28/binutils$
かなり行数が増えてしまったのですが、だんだん良くなっています。
コメント