mirror of
https://github.com/thestk/stk
synced 2026-01-11 20:11:52 +00:00
190 lines
3.6 KiB
Perl
Executable File
190 lines
3.6 KiB
Perl
Executable File
#!/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
|
|
|