You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用BASH删除配置文件中含New的完整条目区块?

BASH删除配置文件中指定关键字的完整区块并直接更新原文件

问题场景

有如下结构的配置文件(test.txt),需要删除以New {开头的整个区块及其所有关联内容,且不想生成冗余临时文件,直接更新原文件:

Test {
   blah..

    site {
        id
    }
    location {
        id
    }
    staff {
        access {
            
        }
    }
}

New {
   blah..

    site {
        id
    }
    location {
        id
    }
    staff {
        access {
            
        }
    }
}

Link {
   blah..

    site {
        id
    }
    location {
        id
    }
    staff {
        access {
            
        }
    }
}

期望处理后移除New区块,保留其余内容。

解决方案

方法1:通用awk方案(兼容所有环境)

用awk基于大括号层级精准匹配区块,通过临时文件替换原文件,执行后临时文件会被自动清理,无冗余残留:

awk '/^New {/{skip=1; brace=1} skip{brace+=gsub(/\{/,"")-gsub(/\}/,""); if(brace==0) skip=0; next} 1' test.txt > temp.txt && mv temp.txt test.txt

逻辑说明:

  • 匹配到^New {行时,开启跳过标记skip,并初始化大括号计数brace=1
  • 处于跳过状态时,统计每行的大括号数量({加1,}减1),当brace归0时,说明区块结束,关闭跳过标记
  • 未被跳过的行正常输出(1代表打印当前行)

方法2:GNU awk原地编辑(无需临时文件)

如果系统安装了GNU awk(Linux默认是GNU awk),可以用其内置的inplace选项直接修改原文件,完全不需要临时文件:

gawk -i inplace '/^New {/{skip=1; brace=1} skip{brace+=gsub(/\{/,"")-gsub(/\}/,""); if(brace==0) skip=0; next} 1' test.txt

为什么不推荐原grep方案?

原方案用grep -A25硬编码行数,一旦New区块的内容行数变化(比如新增/删除子项),就会出现匹配不全或误删其他内容的问题;而awk方案基于大括号层级匹配,不管区块长度如何变化,都能精准定位整个区块。

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:25:25