如果您正在使用 perl 在命令行上寻找快速解决方案,这对于flip-flop操作员来说是一个理想的情况。现在,有两种方法可以在极端情况下解释这个问题——只要pattern1出现之前,这两种方法的功能都是一样的pattern2:
如果pattern1在 pattern2之后但在pattern3之前,则删除pattern1和pattern3之间的所有内容
或者,如果pattern1在 pattern2之后但在pattern3之前什么都不做,除非你看到另一个pattern1。
在我们开始之前,请注意 perl 的争论-p
-n assume "while (<>) { ... }" loop around program
-p assume loop like -n but print line also, like sed
现在,首先,我给你..
perl -pe'$x ||= /7/; $_= "" if /5/ .. /8/ and $x' <(seq 1 10)
1
2
3
4
5
6
9
10
$x ||= /7/: 这设置$x为/7/when $xis的返回值false。匹配时/7/会返回。true这意味着$x在第一次匹配时设置为 true,并且本质||=是永远不会在变量已经为 true 时设置它。
然后它设置$_ = ''范围是否在和之间/5/,/8/并且它已经设置$x为真。记住短路的工作方式:a && b意味着b只有在a评估为时才运行true。在这种情况下,评估的事实a将设置触发器操作符的状态——这就是我们想要的;然而,我们只希望在$_ = ''已经看到的情况下发生7。
现在,对问题的第二种解释只需切换顺序......
perl -pe'$x ||= /7/; $_= "" if $x and /5/ .. /8/' <(seq 1 10)
这将打印整个范围。Perl/5/直到找到/7/. 在我们的连续范围内,这不会发生。
顺便说一句,要真正让其中一些答案感到羞耻,许多空间都不是必需的......
perl -pe'$x||=/2/;$_=""if$x&&/5/../8/' # secksey