perl匹配并删除行数

时间:2014-09-11 09:17:34

标签: regex perl

我正在尝试匹配一行,并删除一些文件之后的几行(包括匹配的一行)。当我放置一个单独的文件时,我的代码就可以运行,但是当我尝试执行* .tcl时,它没有做任何事情。你能建议吗?感谢

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

3 个答案:

答案 0 :(得分:3)

m??只匹配一次。如果要为每个文件重置它,则应添加

reset if eof

答案 1 :(得分:1)

我不确定下一个多少是正确的:

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

答案 2 :(得分:1)

我建议您详细阅读perlopm??部分的详细信息:

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

    另一个例子改变了第一个&#34; latin1&#34;编码它找到&#34; utf8&#34;在pod文件中:

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

    匹配一次行为由匹配分隔符?控制;与任何其他分隔符一样,这​​是正常的m//运算符。

         

    由于历史原因,m中的前导m?PATTERN?是可选的,但不推荐使用生成的?PATTERN?语法,会在使用时发出警告,并且可能会从以后的Perl稳定版本中删除(恕不另行通知!)。

  •   

正如您所看到的,这讨论并演示了在处理多个文件时使用reset的必要性。它还建议始终包含m运算符,因为不推荐使用其他语法。

因此,我会将您的代码重写为以下内容:

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