in reply to Re^2: Manipulating File Contents Interactively
in thread Manipulating File Contents Interactively

What he was saying is that you have not given us enough detail for anyone to point you to an existing example, but it doesn't sound very hard. Unfortunately nobody can show you how to do it because you didn't give enough detail. So while Perl can do it, you need a clearer spec.

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:

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; }
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.