我想匹配一行并从它的某些文件(包括匹配的一个)后删除几行。事情是我的代码工作时,我把一个单一的文件,但当我尝试做*。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