in reply to Re^2: Join lines that match an string
in thread Join lines that match an string

You have given an input, but no output. Without that, how can we know if our code outputs to spec? If you run my code above against your input file, do you get what you expect?

Replies are listed 'Best First'.
Re^4: Join lines that match an string
by Anonymous Monk on Jul 12, 2010 at 23:50 UTC

    Kennethk, there's no output after running your code

    Now let me clarify myself; I have a file with tons of lines, but there're many lines that I want to join in one and I found that I can match the start with "remotely" and the end with "p_agrs", so the lines that are in the middle would be in the one which contains "remotely", later I'll drop the rest of them using a grep remotely data01 > data02

      I am confused. If I copy the posted file:

      EV = 0x10eb250 (class, event_handle: 3503519, mc_ueid: 1278629168) 20100708 224608.259843 RULES: IMC110203I: #3503519: $EV.m c_host 20100708 224608.260757 RULES: IMC110801I: #3503519: Rule e execution starting with . . . msg='script to be execute remotely: exists("TRUSTEDALARM"); Local Id: Rem_010965WAP_18504'; . . . p_agrs

      into the file 'input.txt' and then execute the command

      perl -e 'while(<>){chomp; last if /p_agrs/;print if /remotely/}' < input.txt

      I get the output

      msg='script to be execute remotely:

      Is this not consistent with what you observe?

      From the discussion I see that I misunderstood your initial posting. But I am as confused as kennethk is.

      What I think so far:

      • you have a file with a lot of lines
      • you want to match several lines and join them into one
      • the lines you want to match build a consecutive range (e.g. lines 5-11)
      • the range of lines you want to match starts with a line containing the string "remotely"
      • the range of lines you want match ends with a line containing the string "p_agrs"

      Based upon that, I guessed this code:

      #! /usr/bin/perl use strict; use warnings; # open file and read from that handle... while ( <DATA> ) { chomp; print if m/remotely/ ... m/p_agrs/; print $/ if m/p_agrs/; } __DATA__ not me foo remotely bar01 bar02 bar03 p_agrs i am not here foo2 remotely barbar01 p_agrs i am out...

      result:

      foo remotelybar01bar02bar03p_agrs foo2 remotelybarbar01p_agrs

        What really isn't clear in the OP is whether you want to keep the lines you don't join in the output or throw those lines away. This isn't even clear from your detailed description, though in your code you throw them away. I assumed the OP wanted to keep those lines and only change the joined lines.