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

Perl 将字符串附加到从第二行开始的每一行,perl,append,lines,Perl,Append,Lines,我有一个文件,如图所示 ford speed .... hyundai speed ... ferrari speed .... BMW Merc lambo speed ... 我想在从第2行开始的每一行中搜索“速度”,如果没有找到,我想附加“速度”。 i、 我希望我的输出是 ford speed .... hyundai speed ...

我有一个文件,如图所示

    ford
    speed ....
    hyundai
    speed ...
    ferrari
    speed ....
    BMW
    Merc
    lambo
    speed ...
我想在从第2行开始的每一行中搜索“速度”,如果没有找到,我想附加“速度”。 i、 我希望我的输出是

        ford
        speed ....
        hyundai
        speed ...
        ferrari
        speed ....
        BMW
        speed
        Merc
        speed
        lambo
        speed ...
是否有任何一行代码可以用于上述问题,就像用于附加到每一行的代码一样

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

行号在
$中可用。

perl -plne 'if($.%2==0){unless(/speed/) {print "speed";$.++;}}' your_file
因此,如果您需要在一行中的每一行上执行某些操作,您可以执行以下操作:

perl -ple 's/^/speed/ if $. % 2 == 0' filename
将%运算符direclty的结果解释为布尔值,可以简化为:

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

阅读有关
$的文档。

行号在
$中可用。

perl -plne 'if($.%2==0){unless(/speed/) {print "speed";$.++;}}' your_file
因此,如果您需要在一行中的每一行上执行某些操作,您可以执行以下操作:

perl -ple 's/^/speed/ if $. % 2 == 0' filename
将%运算符direclty的结果解释为布尔值,可以简化为:

perl -ple 's/^/speed// if !($. % 2)' filename
阅读有关
$的文档。

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 ...
> 
测试:

> 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 ...
> 

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

  • 已打印奇数行
  • 当前的一个不是/速度/
所以。。。($odd=(到目前为止打印的行数)%2)

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


虽然它是一个折线器,现在不是一个折线器=)

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

  • 已打印奇数行
  • 当前的一个不是/速度/
所以。。。($odd=(到目前为止打印的行数)%2)

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

虽然这是一个线对半,而不是一个线现在=)

这里有另一个想法:

perl -ne 'print "speed\n" if ( $v = !m/^\s*speed\b/ and $no_speed ); print; $no_speed = $v'
还有一个想法:

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

但这会在每一行中打印。。它不会检查备选行中是否有速度。此外,它也不会调整到这样一个事实,即如果缺少速度行,则行计数应在奇数/偶数之间切换。但这会在每个备选行中打印。。它不检查备选线路中是否有速度。此外,它也不适应这样一个事实,即如果缺少速度线路,线路计数应该在奇数/偶数之间切换。我有一个非常基本的问题。如果您尝试在上面的一行中打印
$。
的值,它打印的第一个值是
8(Merc)
,现在您执行
$。++
,使值变为
9
,然后由于循环,它变为
10
。如果我们查看当前文件,其中只有
10行
,因此
$。==10
的值表示当前文件中的
速度
。所以perl是否在内存中生成完整文件的本地副本,然后在下一次迭代中同时写入和读取
修改后的文件
?我的基本问题是,我们如何能够迭代比
临时文件
中的行数更多的行,直到和除非它(本地副本)同时也在修改。非常感谢@sarathi。。这对我来说很好。但是如果速度在“lambo”之后的末尾不存在,这不会打印值。我有一个非常基本的问题。如果您尝试在上面的一行中打印
$。
的值,它打印的第一个值是
8(Merc)
,现在您执行
$。++
,使值变为
9
,然后由于循环,它变为
10
。如果我们查看当前文件,其中只有
10行
,因此
$。==10
的值表示当前文件中的
速度
。所以perl是否在内存中生成完整文件的本地副本,然后在下一次迭代中同时写入和读取
修改后的文件
?我的基本问题是,我们如何能够迭代比
临时文件
中的行数更多的行,直到和除非它(本地副本)同时也在修改。非常感谢@sarathi。。这对我来说很好。但是如果速度在“lambo”之后的末尾不存在,则不会打印该值。对于上面的示例,它可以正常工作。。但如果“lambo”之后不存在速度,该怎么办。如果不存在,那么我希望它在那之后也能打印速度。啊哈,最后一行。我错过了那个案子。如果$odd},则应该是smth类似的
结束{print“speed”,但是
$。++
变量较短。对于上面的示例,它可以正常工作。。但如果“lambo”之后不存在速度,该怎么办。如果不存在,那么我希望它在那之后也能打印速度。啊哈,最后一行。我错过了那个案子。如果$odd}
,则应该是smth类似的
结束{print“speed”,但是
$。++
变量较短。