0

我有一个如图所示的文件

    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,例如用于附加到每一行的oneliner,例如

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

4 回答 4

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 ...
> 
于 2012-09-18T11:52:54.793 回答
1

在这种情况下我会坚持perl -pe,但是当两者都需要输出额外的“速度”行时:

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

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

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

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

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

虽然它现在是一个半线而不是一个线=)

于 2012-09-18T12:44:10.897 回答
0

这是另一个想法:

perl -ne 'print "speed\n" if ( $v = !m/^\s*speed\b/ and $no_speed ); print; $no_speed = $v'
于 2012-09-18T13:50:49.427 回答
-1

行号在$.

因此,如果您需要在一行中的每一行执行一些操作,您可以执行以下操作:

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

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

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

阅读perlvar 手册页以获取关于$.

于 2012-09-18T11:14:19.107 回答