我想匹配一行並從它的某些文件(包括匹配的一個)後刪除幾行。事情是我的代碼工作時,我把一個單一的文件,但當我嘗試做*。tcl例如,它什麼都不做。你能建議嗎?謝謝perl匹配並刪除行數
perl -i -ne '$n=12 if?$match?;print unless$n-->0' *.tcl
我想匹配一行並從它的某些文件(包括匹配的一個)後刪除幾行。事情是我的代碼工作時,我把一個單一的文件,但當我嘗試做*。tcl例如,它什麼都不做。你能建議嗎?謝謝perl匹配並刪除行數
perl -i -ne '$n=12 if?$match?;print unless$n-->0' *.tcl
我建議在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
我不知道有多少是正確的未來:
perl -ne 'reset if eof;print unless((m?$patt? and $.=1)..12)' *.txt
它是正確的;)感謝 – TheBlackCorsair 2014-09-12 09:29:27
感謝您的很好的解釋 – TheBlackCorsair 2014-09-15 15:40:03