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

如何使用awk修改XML指定type1标签下prop 'b'的value属性值

问题原因分析与解决方案

原命令错误点

  • 匹配到<elem_name name="type1">行后,没有先输出该行就直接执行getline读取下一行,直接导致该行丢失,就是你看到的name="type1"内容被删除的原因
  • 硬编码循环读取4行逻辑非常不健壮,只要节点内的标签顺序、行数发生变化就会失效,且你匹配的是字符a,和你要修改的name='b'的prop节点完全不匹配
  • sub替换规则错误:你直接替换value=为test,最终会得到test"000"的错误结果,完全不符合修改value属性值的需求
  • 重复输出逻辑:匹配块内已经执行了print,块外又执行了一次print,会导致行重复写入输出文件

修正后的AWK实现

采用状态标志位判断是否在type1的elem_name节点内,不需要硬编码行数,适配节点内任意顺序的标签:

gawk '
# 匹配到type1的elem_name起始节点,设置标志位为1,先输出当前行
/<elem_name name='\''type1'\''>/ {
    in_type1 = 1
    print $0 > "test.xml"
    next
}
# 匹配到elem_name结束节点,标志位清零,输出当前行
/<\/elem_name>/ {
    in_type1 = 0
    print $0 > "test.xml"
    next
}
# 只有在type1节点内,才匹配name为b的prop标签
in_type1 == 1 && /<prop name='\''b'\'' / {
    # 替换value属性的值,这里示例改成111,可自行替换为目标值
    sub(/value="[^"]*"/, "value=\"111\"", $0)
}
# 所有行统一输出
{ print $0 > "test.xml" }
' original_file.xml

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:24:03