如何使用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
相关产品推荐
相关产品推荐

