The script iterates through the files in the directory and replaces the target string with a regular expression match.
#!/usr/bin/perl -w
use strict;
# Trave Target directory and modify files under it.
# Modified files are matched using regex.
#
# V1.1
use Getopt::Long;
my $usage = q{
Usage: fix_fetch_found [options] [dir]
Output is write back to files and marked with /*by script begin||end*/.
options:
dir Dir to fix error that fetch and %found is null are out of order
-?,--help Display this help message
};
# process the command line
my $help = 0;
my $dirpath = $ARGV[0];
GetOptions(
‘help|?‘ => \$help,
) or die $usage;
if ($help) {
print $usage;
exit;
}
# main actions
my $string = get_localtime($dirpath);
my $log = $string.".log";
my $modified_log = $string."_modified.log";
Traversal($dirpath,$log);
open(Log_File,"$log") or die("Could not open ‘$log‘ for reading $!");
while(my $name = <Log_File>){
chomp($name);
my $flag = fix_file($name);
if ($flag){
write_file_a($modified_log,$name."\n");
}
}
close(Log_File);
exit;
# fix file with filename
sub fix_file{
my ($filename) = @_;
my $flag = 0;
my $filedata = read_file($filename);
my $modified_data = modified_content($filedata);
#print "check file $filename...\n";
my $result = check_fix($modified_data,$filename);
if ($result){
write_file_w($filename, $modified_data);
print "fix file $filename!\n";
$flag = 1;
}
return $flag;
}
# check whether file is modified
sub check_fix{
my ($file_1,$filename) = @_;
my $result = 1;
my $file_2 = read_file($filename);
if ($file_1 eq $file_2){
$result = 0;
# print "$filename is not modified!\n";
}
return $result;
}
# modify file content using regex
sub modified_content{
my($content) = @_;
#match string with /* FETCH VARS GUESSED */
$content =~ s/IF\s*\n*\s*.*%ISOPEN\s*AND\s*\(.*%FOUND\s*IS\s*NULL\s*OR.*%FOUND\n*.*\)\s*THEN\n*\s*\/\* FETCH VARS GUESSED \*\/\s*FETCH\s*([\w_]+)\s*INTO([^;]*);/\/*by script begin*\/fetch $1 into $2;\n if $1%isopen and $1%found then\/*by script end*\//gi;
#match string without /* FETCH VARS GUESSED */
$content =~ s/IF\s*\n*\s*.*%ISOPEN\s*AND\s*\(.*%FOUND\s*IS\s*NULL\s*OR.*%FOUND\n*.*\)\s*THEN\n*\s*FETCH\s*([\w_]+)\s*INTO([^;]*);/\/*by script begin*\/fetch $1 into $2;\n if $1%isopen and $1%found then\/*by script end*\//gi;
return $content;
}
# Trave dir and write all file path into a log
sub Traversal{
my ($path,$file) = @_;
my $subpath;
my $handle;
my $record;
if(-d $path){
if(opendir($handle,$path)){
while($subpath = readdir($handle)){
if(!($subpath =~ m/^\.$/) and !($subpath =~ m/^(\.\.)$/)){
my $p = $path."/$subpath";
if (-d $p){
Traversal($p,$file);
}
else{
open($record,">>$file")||die("Could not open ‘$file‘ for writing $!");
print $record($p."\n");
close($record);
}
}
}
}
closedir($handle);
}
return;
}
# get local time and append a string for file name
sub get_localtime{
my ($path) [email protected]_;
(my $sec,my $min,my $hour,my $day,my $mon,my $year,my $wday,my $yday,my $isdst)=localtime(time());
$year+=1900;
$mon+=1;
my $time = join("_",$year,$mon,$day,$hour,$min,$sec);
my $str = $path."_".$time;
return $str;
}
# read file
sub read_file {
my ($filename) = @_;
open my $in, ‘<‘, $filename or die "Could not open ‘$filename‘ for reading $!";
local $/ = undef;
# local $/ = undef can read all content into a variable
my $all = <$in>;
close $in;
return $all;
}
# write file w
sub write_file_w {
my ($filename, $content) = @_;
open my $out, ‘>‘, $filename or die "Could not open ‘$filename‘ for writing $!";
print $out $content;
close $out;
return;
}
# write file a
sub write_file_a{
my ($filename,$line) = @_;
open (my $out,">>$filename") or die "Could not open ‘$filename‘ for writing $!";
print $out $line;
close $out;
return;
}
My Perl script---Trave Target directory and modify files with regex