如何通过Grep匹配关键词删除文件指定行并更新文件
解决方法:删除关键词所在行的上一行及下两行
方法1:用awk实现(推荐)
awk能直接跟踪行号,标记需要删除的行范围,逻辑清晰且不易出错。假设目标关键词是main,执行以下命令即可:
awk '/main/ { del[NR-1] = del[NR] = del[NR+1] = del[NR+2] = 1 } !del[NR]' sourcefile
逻辑说明:
- 当匹配到含
main的行时,把该行(NR)、上一行(NR-1)、下两行(NR+1、NR+2)都标记为待删除; - 最后只输出没有被标记的行。就算
main在文件第一行,NR-1等于0,awk会自动忽略这个无效行号,不会出问题。
方法2:用sed实现
sed需要通过保持空间标记待删除的上一行,同时处理当前行和下两行,注意要先删后面的行避免行号偏移:
sed -e '/main/{x;s/^/1/;x;N;N;N;d;}' -e 'x;/1/{s/1//;x;d;}' -e x sourcefile
逻辑说明:
- 匹配到
main时,先在保持空间存一个标记1,然后读取后面3行(自身+下两行)直接删除; - 处理后续行时,检查保持空间是否有标记,有则删除当前行(对应
main的上一行),然后清除标记; - 最后把当前行存入保持空间,循环处理整个文件。
为什么你之前的方法没生效?
grep -vA2 -vB1 main sourcefile无效:-v是反向匹配,-A/-B是匹配成功后的上下文输出,两者组合逻辑混乱,根本没法正确排除需要删除的行范围。- 用grep拿行号再sed循环删除失败:删除行后,后面的行号会自动前移,按原行号循环删除会导致偏移,要么漏删要么误删。比如删了第5行,原来的第6行变成第5行,后续按原计划删第6行就会删错内容。
内容的提问来源于stack exchange,提问作者user8845141
相关产品推荐
相关产品推荐

