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

Sorry for not posting an example, but here it is, so what I need to do is join in one line all the lines that match "remotely" on it (include it) and stop where it's an "p_agrs" match, does this make sense?

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

Replies are listed 'Best First'.
Re^3: Join lines that match an string
by ww (Archbishop) on Jul 12, 2010 at 22:12 UTC
    "...does this make sense?"

    Better, but without more sample data (including examples of non-desired matches) requested above, not enough.

Re^3: Join lines that match an string
by kennethk (Abbot) on Jul 12, 2010 at 23:09 UTC
    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?

      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