2014-09-11 143 views
2

我想匹配一行並從它的某些文件(包括匹配的一個)後刪除幾行。事情是我的代碼工作時,我把一個單一的文件,但當我嘗試做*。tcl例如,它什麼都不做。你能建議嗎?謝謝perl匹配並刪除行數

perl -i -ne '$n=12 if?$match?;print unless$n-->0' *.tcl 

回答

1

我建議在perlop閱讀節上m??詳細:

  • m?PATTERN?msixpodualgc
  • ?PATTERN?msixpodualgc

    這就像m/PATTERN/搜索,除了它調用的reset()運營商之間只有一次匹配。例如,當您只想查看一組文件中每個文件中第一次出現的內容時,這是一個有用的優化。只有當前包裝本地的m??模式纔會重置。

    1.  while (<>) { 
        2.   if (m?^$?) { 
        3.       # blank line between header and body 
        4.   } 
        5.  } continue { 
        6.   reset if eof; # clear m?? status for next file 
        7.  } 
    

    又如切換第一「latin1的」編碼它發現爲「UTF8」在一個莢文件:

    1.  s//utf8/ if m?^=encoding \h+ \K latin1 ?x; 
    

    匹配一次行爲由匹配定界符是?控制;與任何其他分隔符這是正常的m//運營商。

    由於歷史的原因,在m?PATTERN?領先m是可選的,但由此產生的?PATTERN?語法已過時,會警告使用情況和可能在Perl的未來的穩定版本中移除(恕不另行通知!)。

正如你所看到的,這個講述和演示的需要處理多個文件時使用reset。它還建議總是包含m運算符,因爲其他語法已被棄用。

因此,我要重寫代碼以下:

perl -i -ne '$n = 12 if m?$match?; print if --$n < 0; reset if eof' *.tcl 
+0

感謝您的很好的解釋 – TheBlackCorsair 2014-09-15 15:40:03

3

m??只匹配一次。如果你想重新設置爲每個文件,你應該添加

reset if eof 
+0

感謝,復位如果EOF是有用 – TheBlackCorsair 2014-09-12 09:29:11

1

我不知道有多少是正確的未來:

perl -ne 'reset if eof;print unless((m?$patt? and $.=1)..12)' *.txt 
+0

它是正確的;)感謝 – TheBlackCorsair 2014-09-12 09:29:27