2014-09-11 145 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