寻找命令行工具(awk、sed 等)命令来省略从文件开头到模式第 n 次出现的行。换句话说,仅打印从第 n 次出现的模式到文件末尾的内容。假设每行一场比赛;线不一定以模式开头。
例如,省略以下从文件开头到第二个的foo
内容:
something
abc foo1
maybe something else
foo2 -this line and anything before is gone-
maybe not
foo3
something
期望的结果:
maybe not
foo3
something
包含/排除第 n 次出现的行可获得奖励积分。
答案1
到排除模式第 n次出现
awk -v 'n=3' 'NR == 1, /pattern/ && !--n {next}; 1'
(替换3
为您想要的出现次数(在您的情况下为 2),并pattern
替换为您的实际模式(foo
在您的情况下))。
例子:
$ seq 30 | awk -v 'n=3' 'NR == 1, /6/ && !--n {next}; 1'
27
28
29
30
到包括模式第 n次出现
awk -v 'n=3' '/pattern/ && !--n, 0'
例子:
$ seq 30 | awk -v 'n=3' '/6/ && !--n, 0'
26
27
28
29
30
答案2
% perl -ne 'BEGIN{$NTH=2;$p=0} print if $p; /foo/ && $NTH--; $p=1 if !$NTH' input
maybe not
foo3
something
哪里NTH
是多少次,然后就需要一个要打印的flag;匹配时递减,如果递减足够NTH
则启用打印。NTH
移动print
到终点去捕捉最终想要的foo
。