- From: Sandro Hawke <sandro@w3.org>
- Date: Wed, 28 Jan 2004 12:32:27 -0500
- To: ericm@w3.org
- Cc: www-archive@w3.org
Does a perl-regexp search/replace on multiple files, in place. Makes a backup copy in $HOME/.global-replace-saves. #!/usr/bin/perl -w ### *** BACKUP IS NOT AS PARANOID AS IT SHOULD BE. DOESNT ### EVEN CHECK FOR ERRORS ### use strict; # avoid UTF-8 problems # http://london.pm.org/pipermail/london.pm/Week-of-Mon-20030512/018876.html use POSIX 'locale_h'; setlocale(LC_CTYPE, "en_US") or warn "uh oh... $!"; use locale; my $from = shift @ARGV; my $to = shift @ARGV; my @files = @ARGV; my %data = (); die "usage: global-replace from-string to-string files...\n" unless @files; chomp(my $cwd = `pwd`); my $saveroot = $ENV{HOME} . "/.global-replace-saves$cwd/"; my $old_sep = $/; $/ = undef; $| = 1; my $matching_files = 0; for my $file (@files) { open(F, "<$file") or die("Can't read $file"); $data{$file} = <F>; close(F); my $nonrev = ($data{$file} =~ m/$to/g); my $presize = length($data{$file}); my $count = ($data{$file} =~ s/$from/$to/mge); my $postsize = length($data{$file}); if ($count) { $matching_files++; printf("%4d %s (%dk->%dk, %d%%) %s\n", $count, $file, $presize/1024, $postsize/1024, $postsize*100/$presize, ($nonrev ? "non-reversable" : ""), ); } } $/ = $old_sep; if ($matching_files) { print STDERR "Save prefix:\n=> $saveroot\n"; print STDERR "Do replacement in all files? (y/n) "; my $reply = <STDIN>; if ($reply =~ m/^y(es)?$/i) { system("mkdir -p $saveroot"); for my $file (@files) { system("cp -a $file $saveroot/$file"); open(F, ">$file") or die("Can't write $file"); print F $data{$file}; close(F); } print STDERR "Files Backed Up and Modified.\n"; } else { print STDERR "Aborted.\n"; } } else { print STDERR "Pattern (\"$from\") not found in any named files.\n"; }
Received on Wednesday, 28 January 2004 12:31:35 UTC