#!/usr/bin/env perl # This perl script is for doing batch renamings of identifiers. To use it: # # (1) create a file "renamings.txt", with a list of entries "foo:bar" (or "foo;bar"), # one per line # (2) put this script and renamings.txt in the same directory, and make sure # the script is executable. # (3) use "[path]/rename.pl [path]/file" to do the renaming. # On a Unix system, at least, you can use wildcards. # # Example: if you put rename.pl and renamings.txt in lean/library, then # from that directory type # # ./rename.pl data/nat/*.lean # # to do all the renamings in data/nat. Alternative, change to that directory, # and type # # ../../rename.pl *.lean # # Notes: # # For lines "foo:bar" we assume that foo has only letters, numbers, _, or "'" or ".". # # Lines "foo;bar" replaces every occurrence of "foo" by "bar", # even if "foo" is a substring of a bigger expression. # "foo" can contain whitespace or special characters, but cannot contain newlines. # # Parentheses (and other characters with a special meaning in regular expressions) # have to be escaped # # See http://perldoc.perl.org/perlfaq5.html, "How can I use Perl's i option from # within a program?" for information on the method used to change a file in place. # # See also http://perldoc.perl.org/File/Find.html for information on how to write # a subroutine that will traverse a directory tree. use strict; use warnings; use Cwd 'abs_path'; use File::Basename; use File::Spec::Functions; # the global list of renamings my %renamings = (); my %literalrenamings = (); # renamings which have # get the list of renamings from the file sub get_renamings { my $fullname = catfile(dirname(abs_path($0)), "renamings.txt"); open (my $renaming_file, "<", $fullname) or die $!; while (<$renaming_file>) { if (/([\w'.]+)[:]([\w'.]+)\n/) { $renamings{$1} = $2; } else { if (/(.+)[;](.+)\n/) { $literalrenamings{$1} = $2; }} } close $renaming_file or die $!; } # print them out - for debugging sub show_renamings { foreach my $key (keys %renamings) { print $key, " => ", $renamings{$key}, "\n"; } print "\n"; foreach my $lkey (keys %literalrenamings) { print $lkey, " -> ", $literalrenamings{$lkey}, "\n"; } } # rename all identifiers a file; original goes in file.orig sub rename_in_file { my $filename = shift; local($^I, @ARGV) = ('.orig', $filename); while (<>) { foreach my $key (keys %renamings) { # replace instances of key, not preceeded by a letter, and not # followed by a letter, number, or ' s/(?<![a-zA-z])$key(?![\w'])/$renamings{$key}/g; } foreach my $lkey (keys %literalrenamings) { # replace all instances of lkey s/$lkey/$literalrenamings{$lkey}/g; } print; } } get_renamings; # show_renamings; foreach (@ARGV) { rename_in_file $_; }