Category Archives: 4.パターンマッチ・検索・置換

ChangeLogオプション解析(その6)

続きです。

古い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$ 

かなり行数が増えてしまったのですが、だんだん良くなっています。