如何使用命令行工具从第 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
.
不保留线:
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)