in reply to replace fist and last occurrences of N

Try this if your files are too big for your memory:
#!/usr/bin/perl -w use strict; use warnings; my $filename = shift; open my $fh,'<',$filename or die "No input file\n"; open my $ofh, '>', "$filename.new" or die "Can't open output file\n"; my $previousline= undef; while (<$fh>) { chomp; s/(?<=[^n])n|n(?=[^n])/^/ig; #borrowed from jwkrahn if (defined $previousline) { ($previousline=~/[^n]$/i) and (s/^n/^/i); (/^[^n]/i) and ($previousline=~s/n$/^/i); print $ofh $previousline,"\n"; } $previousline= $_; } print $ofh $previousline,"\n" if (defined $previousline); close $fh; close $ofh; rename "$filename.new",$filename;
This creates a temporary copy of the data file so you have to make sure that enough space is on disk. Or preferably check the return values of the print statements for errors.

Replies are listed 'Best First'.
Re^2: replace fist and last occurrences of N
by GrandFather (Saint) on Jul 13, 2008 at 00:34 UTC

    This replaces the first and last n in each n run with ^ (rather than quoting the n run). It also "quotes" all n runs, not just the first and last as required by the OP.


    Perl is environmentally friendly - it saves trees
      Read again. The OP wanted a replacement and not a quote.

      I made sure now by making a diff between the output of my program and what he gave as wanted. Absolutely identical.

        I apologise. You are quite right. My first read through the OP's node left me with the impression that his problem was a whole lot more interesting than it is! I thought he was wanting to quote the first and last run only, leaving all other n/N runs unaltered.


        Perl is environmentally friendly - it saves trees