如何使用sed匹配模式时排除指定的多个配置节?
如何用sed精准保留指定配置节并移除后续内容
原始配置文件
; My Config ; [CITY] URL='my.city.com' ID='1234' PID='1' [SITE] URL='my.site.com' ID='2345' PID='2' [UNIT] URL='my.unit.com' ID='3456' PID='3' [BOB] URL='my.bob.com' ID='123456' PID='15' . . .
需求与现有问题
需求:保留配置中**[CITY]、[SITE]、[UNIT]**三个固定配置节,移除这三个节之后的所有内容。
之前尝试过这条sed命令:
sed -e '/.*\[[^DUC].*\]/Q' test.conf
在示例配置里能得到预期结果:
; My Config ; [CITY] URL='my.city.com' ID='1234' PID='1' [SITE] URL='my.site.com' ID='2345' PID='2' [UNIT] URL='my.unit.com' ID='3456' PID='3'
但这条命令有明显缺陷:如果后续第一个配置节名称以C、S或U开头(比如[CAR]、[STORE]),就会失效——它只是排除了以非D、U、C开头的节,没法精准匹配指定的三个节名称。
用sed实现精准匹配的方案
完全可以用sed实现精准需求,不需要更换工具,提供两种可行思路:
方案一:匹配到非指定配置节时退出
sed -e '/^\[[^]]*\]$/{/^\[CITY\]$/b;/^\[SITE\]$/b;/^\[UNIT\]$/b;Q}' test.conf
逻辑说明:
/^\[[^]]*\]$/:精准匹配所有配置节的行(格式为[XXX])/^\[CITY\]$/b;/^\[SITE\]$/b;/^\[UNIT\]$/b:如果是指定的三个节,直接跳过后续逻辑,继续处理下一行Q:如果匹配到的是其他配置节,立即退出sed,后续内容不再输出
方案二:匹配到第三个指定节后终止(适用于节顺序固定的场景)
如果配置中三个节的顺序固定为CITY→SITE→UNIT,可以用更简洁的命令:
sed -e '/^\[UNIT\]$/{:a;n;/^\[[^]]*\]$/Q;ba}' test.conf
逻辑说明:
/^\[UNIT\]$/:匹配到[UNIT]节的行:a;n:定义循环标签a,读取下一行/^\[[^]]*\]$/Q:如果读到新的配置节行,直接退出;否则回到标签a继续读取下一行
补充说明
- 如果三个配置节的顺序不固定,方案一更稳妥;
- 如果顺序固定,方案二执行效率更高。
内容的提问来源于stack exchange,提问作者Gregg H
相关产品推荐
相关产品推荐

