删除从文件开头到第 n 次出现的模式

删除从文件开头到第 n 次出现的模式

寻找命令行工具(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

相关内容