My Perl script---Trave Target directory and modify files with regex

Source: Internet
Author: User
Tags vars perl script



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


Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.