For instance do the inserted lines borrow any information from the matched lines? Are there any strings which you only match if they are not part of certain other things? If so then you'd have to use a more complex approach. Otherwise you could do something as simple as build your transformations up with:
This is untested code so it may not even compile. It is also rather inflexible. See references quick references for an explanation of the data structures I used. Note that if a line matches both foo and bar this will insert both sets of strings and you can't control the order in which it does it. But if you understand how this works, and you understand complex data structures, then you should be able to tackle your undoubtedly more complex situation.my %transformation_by_filetype => ( "c" => { "foo" => qq{ You had a foo. }, "foo" => qq{ Bar is great. }, }, ); Then run something like this: <code> #! /usr/bin/perl -w use strict; for my $file (@ARGV) { my $filetype = determine_filetype($file); my $transformation = $transformation_by_filetype{$filetype}; rename($file, "tmp.$$") or die "Can't rename $file to tmp.$$: $!"; open (IN, "<", "tmp.$$") or die "Can't read tmp.$$: $!"; open(OUT, ">", $file) or die "Can't write $file: $!"; while (my $line = <IN>) { print OUT $line; for my $pattern (keys %$transformation) { if ($line =~ /$pattern/) { print OUT $transformation->{$pattern}; } } } } sub determine_filetype { my $filename = shift; $filename =~ s/.*\.//; return $filename; }
In reply to Re^3: Manipulating File Contents Interactively
by tilly
in thread Manipulating File Contents Interactively
by TheWorldPeace
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |