SED删除行数超出预期求助:如何修正多删一行的异常?
解决SED删除模式区间行时多删行的问题
你的问题出在SED默认的区间匹配逻辑上——用/起始模式/,/结束模式/d这种写法时,SED会从第一个匹配起始模式的行开始,一直删除到第一个匹配结束模式的行,但如果后续有不属于目标块的结束模式行,或者块之间有嵌套/重叠,就会出现误删。
要精确控制只删除特定起始模式对应的结束模式区间,可以用SED的状态机写法,避免贪婪匹配:
假设你的目标起始模式是START_TARGET,结束模式是END_COMMON,执行以下命令:
sed '/START_TARGET/{:loop; N; /END_COMMON/!b loop; d}' 你的输入文件.txt
命令解释:
/START_TARGET/:仅当匹配到目标起始行时,才进入处理逻辑:loop:定义一个循环标记,用于持续读取后续行N:把下一行追加到当前模式空间(合并多行)/END_COMMON/!b loop:如果当前模式空间里还没匹配到结束模式,就跳回loop标记继续读取下一行d:删除整个模式空间里的内容(也就是从START_TARGET到对应END_COMMON的所有行)
如果需要保留起始行或结束行,只需要调整最后的d为对应的替换逻辑。比如要保留START_TARGET和END_COMMON行,删除中间的内容:
sed '/START_TARGET/{:loop; N; /END_COMMON/!b loop; s/START_TARGET\n.*\nEND_COMMON/START_TARGET\nEND_COMMON/}' 你的输入文件.txt
这种写法能精确锁定从目标起始模式到其对应的结束模式之间的内容,不会误删其他包含结束模式的独立行或其他块的内容。
内容的提问来源于stack exchange,提问作者Zbigniew Szczęsny
相关产品推荐
相关产品推荐

