#!/usr/bin/perl # treesed # Written January 1996 by Rick Jansen (rick@sara.nl) # URL: http://www.sara.nl/rick # usage: treesed pattern1 pattern2 -tree # treesed pattern1 pattern2 -files file1 file2 ... # example: treesed href HREF -files *.html # Treesed searches for pattern1 and replaces pattern1 by pattern2 # if pattern2 supplied. If only pattern1 given treesed just searches. # Treesed will search in all files and subdirectories of the current # directory #-------------------------------------------------------- # Parameters $DoEdit=0; $search_pattern = $ARGV[0]; $search_pattern =~ s/(\W)/\\$1/g; # escape regexp chars shift; while ($#ARGV >= 0) { if ($ARGV[0] eq '-files') { @temp_ls = @ARGV[1 .. $#ARGV]; # Get list of files, skip dirs foreach $file (@ARGV[1 .. $#ARGV]) { if (-f $file) { push(@ls, $file); } } last; } elsif ($ARGV[0] eq '-tree') { &Get_LS; last; } if (! -f $ARGV[0]) { if (defined($replacement_pattern)) { print "usage: treesed pattern1 -tree/-files \n"; exit(1); } $replacement_pattern = $ARGV[0]; #$replacement_pattern =~ s/(\W)/\\$1/g; # escape regexp chars $DoEdit=1; shift; } } # No files? if ($#ls < 0) { print "xx No input files\n"; exit(1); } print "search_pattern: $search_pattern\n"; print "replacement_pattern: $replacement_pattern\n"; if ($DoEdit) { print "\n** EDIT MODE!\n\n"; } else { print "\n** Search mode\n\n"; } #foreach $file (@ls) { # print "$file \n"; #} #-------------------------------------------------------- # Search list of files for pattern $linepos=0; $| = 1; # Force flush after every write foreach $file (@ls) { #print "$file\n"; print '.'; $linepos++; if ($linepos > 50) { $linepos=0; print "\n"; } if (!open(FILE, $file)) { print "\nCould not open $file\n"; next; } $Found = 0; $Count = 0; $lineno = 0; @lines = (); while () { $lineno++; if (/$search_pattern/i) { #print; $Count++; $Found = 1; push(@lines, $lineno); } } close(FILE); if ($Found) { print "\n$file: $Count lines on: @lines\n"; } if ($Found && $DoEdit) { &Edit($file); } } $| = 0; print "\n"; exit(0); #-------------------------------------------------------- # Edit file sub Edit { # Replace $ARGV[0] with $ARGV[1] in $file local($file) = @_; local($bakfile) = $file.'.'.$$; # First create backup open(FILE, $file) || die "Could not open $file for read\n"; open(BAKFILE, ">$bakfile") || die "Could not open $bakfile for backup\n"; while () { print BAKFILE; } close(BAKFILE); close(FILE); # Now replace $ARGV[0] by $ARGV[1] in the backupfile, # result into $file open(BAKFILE, $bakfile) || die "Could not open $bakfile for read\n"; open(FILE,">$file") || die "Could not open $file for write\n"; $Count=0; while () { if (/$search_pattern/i) { $Count++; } s/$search_pattern/$replacement_pattern/gi; print FILE; } close(BAKFILE); close(FILE); print "\nReplaced $search_pattern by $replacement_pattern on $Count lines in $file\n"; } #sub Edit #-------------------------------------------------------- sub Get_LS { # Get a list of full path names into array @ls local(@localls)=`ls -R1`; local($item,$Dir); #print "localls: @localls\n"; $Dir=''; foreach $item (@localls) { #print "$item\n"; if ($item =~ /:$/) { $Dir=$item; chop($Dir); $Dir =~ s/:$/\//; } else { chop($item); $item = $Dir.$item; if ($item !~ /^\s*$/) { push(@ls, $item); } } } @localls=(); } # sub Get_LS