我正在尝试匹配一行,并删除一些文件之后的几行(包括匹配的一行)。当我放置一个单独的文件时,我的代码就可以运行,但是当我尝试执行* .tcl时,它没有做任何事情。你能建议吗?感谢
perl -i -ne '$n=12 if?$match?;print unless$n-->0' *.tcl
答案 0 :(得分:3)
m??
只匹配一次。如果要为每个文件重置它,则应添加
reset if eof
答案 1 :(得分:1)
我不确定下一个多少是正确的:
perl -ne 'reset if eof;print unless((m?$patt? and $.=1)..12)' *.txt
答案 2 :(得分: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. }
另一个例子改变了第一个&#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