#!/usr/local/bin/perl # $Header$ # old_Std.def, new_Std.def, old_user.def を読んで、 # new_user.def を標準出力に表示する。 # ただしこの版では old_Std.def は読むが中は利用しない $rcsid = q$Id$; $my_name = $0; $my_name =~ s#(.*)/##; $my_path = $0; $my_path =~ s|/[^/]+$||; #--------------------- push(@INC,$my_path); require 'getopts.pl'; &Getopts('ho:n:u:'); # ----------------- help ------------- if ( $opt_h ) { &usage ; } # ------------------------------------ if ( $opt_o ) { $OLD = $opt_o } else { $OLD = $ARGV[0] } if ( $opt_n ) { $NEW = $opt_n } else { $NEW = $ARGV[1] } if ( $opt_u ) { $USER = $opt_u } else { $USER = $ARGV[2] } if ( $NEW eq '' || $OLD eq '' || $USER eq '' ) { die " old file name, new filename, user\'s filename required\n"; } # ----------------------------------- # 主として Emacs/perl-mode の文法解釈が不充分なため # (固定文字列そのものでなく)変数を使う。 $three = '###'; $two = '##'; $one = '#'; $string = '[a-zA-Z_]+'; open(OLD) || print " problem reading file($OLD): $!\n" ; open(NEW) || print " problem reading file($NEW): $!\n" ; open(USER) || print " problem reading file($USER): $!\n"; read_user(); read_old(); read_new(); if ( $exit ) { exit }; # ---------------- sub read_user { while() { if ( /^$three/ ) { next ; } elsif ( /(^$string)=(.*)/ ) { $key = $1; $rest = $2; $KEY{$key} = $rest; }} close(USER)} sub read_old { while() { if ( /^$three/ ) { next } elsif ( /^$two(.*)/ ) { next } elsif ( /^$one(.*)/ ) { next }}} sub read_new { my($user); my(%DONE); # check one instance for the key while() { $non_default = 0; $default = 0; $key = ''; $val = ''; if ( /^$three(.*)/ ) { print; ;} elsif ( /^$two(.*)=(.*)/ ) { $key = $1; $val = $2; if (( $user = $KEY{$key}) && ( $DONE{$key} eq '' )) { print "$key=$user\n";} else { print ;}} elsif ( /^$one(.*)=(.*)/ ) { $key = $1; $val = $2; if (( $user = $KEY{$key}) && ($DONE{$key} eq '' )) { print "$key=$user\n";} else { print ;}} else { print } $DONE{$key}++; # mark as already seen }} sub usage { print < user_(new)file ~/perl/CF-customize ~/c ../Standards/sendmail-v7.def ocn.def > ! /tmp/a ○ うまく行ったかは次のようにしたり diff -u ../Standards/sendmail-v7.def /tmp/a 新しい型紙に、古い設定が埋込まれていることが分る ○ 次のようにしたりして確める 102 12:47 grep -v '^#' /tmp/a | sed '/^$/d' 103 12:48 grep -v '^#' ocn.def | sed '/^$/d' この二つの grep の結果は同じこと old_Std.def -> new_Std.def については 項目について、削除・追加 内容について、無指定値の変更 などを誤り出力に表示しようと考えている。 # $Log$