我有一个显示的文件
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
答案 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
,但是我们必须输出额外的“速度”线:
所以......($ 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,了解有关$.