in reply to swapping lines that match a condition

Sounds like a job for regular expressions:

$stuff =~ s/(frontStuff)(stuffToMove1)(middleStuff)(stuffToSwap2)(endi +ngStuff)/$1$4$3$2$5/;
Grab the chunks and swap the #2 and 4 captures for the replace.

PS: This would require multi-line match mode, given your input data; the "middlestuff" would be a newline.


An alternative way to do it, given the regularity of your data, might be to save each record into a hash, then print the hash values back out in whichever order you like. Useful if you're not totally sure of your data, and could be used to remove duplicates or fill in missing fields quite easily.

Replies are listed 'Best First'.
Re^2: swapping lines that match a condition
by TheBigAmbulance (Acolyte) on Sep 10, 2009 at 15:00 UTC

    Thanks SJ!

    I need to walk through this a little so that I can educate myself and understand.

    So if I'm understanding what you are saying, my expression would look something like this:

    s/(^#)(^host)(^filename)(^fixed)(^hardware)(^})/$1$2$3$5$4$6/;

      Close, but you need the /m modifier (See m). This makes ^ match the beginning of the line and $ match the end of the line anywhere within a single string. Note that you'll have to have the whole file as a string to use this. Also, you'll need to match the whole of each line. So a solution might look like this:

      #!/usr/bin/perl use strict; use warnings; my $filename = shift or die "Need a filename"; my $text; SLURP:{ local $/; open my $fh, '<', $filename or die "Error opening $filename: $!"; $text = <$fh>; close $fh; } $text =~ s/(^fixed.*) #match fixed-address \n #followed by newline (^hardware.*) #followed by hardware / $2\n$1 #and switch them (remember newline!) /mgx; #m for multiline, g for multiple matches print $text;
      print pack("A25",pack("V*",map{1919242272+$_}(34481450,-49737472,6228,0,-285028276,6979,-1380265972)))