2012-09-18 28 views
0

開始我有一個文件如圖追加字符串的每一行從第二

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

我想在每個備用線路從第二盯着搜索「速度」,如果未找到我想追加「速度\ N」。 即我希望我的輸出是

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

是否有可用於像用於追加到每行像

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

回答

1

在這種情況下,我會堅持使用perl -pe,但是我們必須輸出額外的「速度」行當兩個:

  • 奇數行的已打印
  • 當前一個不爲/速度/

所以...($奇數=(行數印刷至今)%2)

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

UPDATE:到-n/-p是如何工作的。由於在文件的最後一行是不是PROC正確行事。所以我添加了一個END塊。 「如果我們停在奇數行,追加速度」。

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

雖然這是一個線和A-halfer,而不是一個班輪現在=)

+0

太感謝你了..它工作正常,我。 – unkaitha

+0

它對上面的例子工作正常。但是,如果'lambo'後速度不存在會怎麼樣。如果那不存在,那麼我希望它在之後打印速度。 – unkaitha

+0

啊哈,最後一行。我錯過了那個案子。應該像水木清華'END {打印「速度」,如果$奇}',但隨後的'$。++'變種較短。 – Dallaylaen

-1

的行號的一個上述問題的任何oneliner是availabel $.

所以如果你neeed在一個班輪執行每月的第二個行某些動作,你可以這樣做:

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

解讀%運算照片直接作爲布爾的結果,這可以被簡化爲:

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

the perlvar manual page用於文檔的約$.

+1

但這打印在每個備選線..它不檢查備用線路是否有速度。 – unkaitha

+2

此外,它不適應這樣的事實,如果速度線丟失,行數應該在奇數/偶數之間切換。 – TLP

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

我有一個非常非常基本的問題。如果你試圖在上面的單行中打印'$ .'的值,它打印的第一個值是「8(Merc)」,現在你做'$。++',使得值變爲'9'循環它成爲'10'。如果我們看一下當前文件,那裏只有'10lines',所以'$。== 10'的值意味着我們當前文件中的速度。所以。 perl是否會在內存中創建完整文件的本地副本,而不是「最終」寫入,而不是在下一次迭代中讀取「修改後的文件」? – ronnie

+0

我的基本問題是我們如何迭代更多的行,直到temp文件中有更多的行,除非它(本地副本)也完全修改。 – ronnie

+0

非常感謝你@sarathi ..它適合我。但是如果速度不存在於'lambo' – unkaitha

0

這裏的另一個想法:

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