假设我有一个文件如下:
drink
eat
XXX
pizza
blunzn
sushi
我想从文件中删除所有行,从模式后的第三行开始XXX
,所以结果应该是这样的:
drink
eat
XXX
pizza
blunzn
删除之后的所有行XXX
很简单:
sed -e '/XXX/q' -i data.txt
但是,我发现很难在删除模式后跳过固定数量的行。
到目前为止我想到的最好的是:
sed -e '/XXX/ { N; N; q }' -i data.txt
有没有比添加 n * 更优雅的东西N
(想象一下,我想跳过 50 行)?
我会使用 awk,带有一个变量n
表示匹配行之后要打印的行数/XXX/
:
awk -v n=2 'seen && !n-- { exit } /XXX/ { seen = 1 } 1' file
seen
未初始化(false)直到正则表达式匹配,所以!n--
不评价。当正则表达式匹配时,seen
被设定为true.
When seen
is true,两侧&&
被评估,所以n
每行递减一次。什么时候n
达到0
, !n
变成true,因此脚本退出。
The 1
最后总是true因此,直到脚本退出,每一行都会被打印。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)