将字符串附加到从第二行开始的每一行

时间:2012-09-18 11:00:15

标签: perl append lines

我有一个显示的文件

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

我想在从第2个开始的每个备用线路中搜索“速度”,如果没有找到,我想追加“速度\ n”。 即我希望我的输出是

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

是否有可用于上述问题的oneliner,例如用于附加到每行的问题,如

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

4 个答案:

答案 0 :(得分:3)

perl -plne 'if($.%2==0){unless(/speed/) {print "speed";$.++;}}' your_file

测试:

> cat temp
ford
speed ....
hyundai
speed ...
ferrari
speed ....
BMW
Merc
lambo
speed ...
> perl -plne 'if($.%2==0){unless(/speed/) {print "speed";$.++;}}' temp
ford
speed ....
hyundai
speed ...
ferrari
speed ....
BMW
speed
Merc
speed
lambo
speed ...
> 

答案 1 :(得分:1)

在这种情况下我会坚持使用perl -pe,但是我们必须输出额外的“速度”线:

  • 已打印奇数行
  • 当前的一个不是/ speed /

所以......($ odd =(行数打印到目前为止)%2)

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

UPDATE:由于-n / -p的工作方式,文件中的最后一行未正确处理。所以我为此添加了一个END块。 “如果我们停在奇数线上,就加速”。

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

虽然它是一个线和一个暂停而不是一个班轮现在=)

答案 2 :(得分:0)

这是另一个想法:

perl -ne 'print "speed\n" if ( $v = !m/^\s*speed\b/ and $no_speed ); print; $no_speed = $v'

答案 3 :(得分:-1)

行号在$.

中可用

所以如果你需要在一个班轮的每一行上执行一些动作,你可以做类似的事情:

perl -ple 's/^/speed/ if $. % 2 == 0' filename

将%运算符direclty的结果解释为布尔值,这可以简化为:

perl -ple 's/^/speed// if !($. % 2)' filename

阅读the perlvar manual page,了解有关$.

的文档