|
- #!/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 <pattern2> -tree/-files <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 (<FILE>) {
- $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 (<FILE>) {
- 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 (<BAKFILE>) {
- 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
|