Search code examples
perlappendlines

append string to every line starting from second


I have an file as shown

    ford
    speed ....
    hyundai
    speed ...
    ferrari
    speed ....
    BMW
    Merc
    lambo
    speed ...

I want to search for "speed" in every alternate line staring from 2nd, and if not found i want to append "speed\n". i.e. i want my output to be

        ford
        speed ....
        hyundai
        speed ...
        ferrari
        speed ....
        BMW
        speed
        Merc
        speed
        lambo
        speed ...

Is there any oneliner that can be used for the above problem like the one used to append to each line like

perl -ple 's/^/speed/' filename

Solution

  • I'd stick with perl -pe in this case, however we have to output extra "speed" line when both:

    • odd number of lines has been printed
    • current one is not /speed/

    So... ($odd = (number of lines printed so far) % 2)

    perl -pe 'next if ($odd ^= 1 or /^\s*speed/); print "speed\n"; $odd ^= 1; '
    

    UPDATE: Due to how -n/-p works, the last line in file was not processed correctly. So I added an END block for that. "If we stopped at odd line, append speed".

    perl -ple 'chomp; next if ($odd ^= 1 or /^speed/); print "speed"; $odd ^= 1; END { print "speed" if $odd }'
    

    Though it's a line-and-a-halfer and not one-liner now =)