从第 n 次出现到文件末尾删除

JB0*_*2D1 5 text-processing

如何使用命令行工具从第 n 次出现模式删除到文件末尾sed
例如从foo下面的第三个中删除:

something
foo1
maybe something else
foo2
maybe not
foo3 -this line and anything after is gone- 
I'm not here
Run Code Online (Sandbox Code Playgroud)

$sed '/magic/'

想要的结果:

something
foo1
maybe something else
foo2
maybe not
Run Code Online (Sandbox Code Playgroud)

同样的事情的奖励积分,但保留包含第三个foo.

Sté*_*las 9

不保留线:

awk -v n=3 '/foo/{n--}; n > 0'
Run Code Online (Sandbox Code Playgroud)

保持线路:

awk -v n=3 'n > 0; /foo/{n--}'
Run Code Online (Sandbox Code Playgroud)

尽管我们可能想对其进行一些改进,以便我们在找到第三个后立即退出并停止阅读foo

awk -v n=3 '/foo/{n--; if (!n) exit}; {print}' # not-keep
awk -v n=3 '{print}; /foo/{n--; if (!n) exit}' # keep
Run Code Online (Sandbox Code Playgroud)

sed会比较麻烦。您需要将 foo 出现的次数保留为保留空间中的多个字符,例如:

保持:

sed '
  /foo/{
    x;s/^/x/
    /x\{3\}/{
      x;q
    }
    x
  }'
Run Code Online (Sandbox Code Playgroud)

不保留:

sed -ne '/foo/{x;s/^/x/;/x\{3\}/q;x;}' -e p
Run Code Online (Sandbox Code Playgroud)