如何用sed或awk移除XML属性并替换闭合标签?
用sed/awk实现XML标签转换需求
需求概述
需要将带有属性的<Field>标签转换为以字段名为标签名的简化格式:移除<Field>的name、type属性,并将闭合标签</Field>替换为对应字段名的闭合标签。
原XML内容
<Field name="field1" type="String">AAAA</Field> <Field name="field2" type="Integer">0</Field> <Field name="field4" type="String">BBBB</Field>
期望转换结果
<field1>AAAA</field1> <field2>0</field2> <field4>BBBB</field4>
现有尝试
已通过以下sed命令实现部分属性移除,但无法处理闭合标签替换:
sed 's/ type=".*"//' # and sed 's/Field name="//'
解决方案
方法1:使用sed(推荐)
利用sed的正则捕获组一次性完成所有替换,命令如下:
sed -E 's/<Field name="([^"]+)" type="[^"]+">([^<]+)<\/Field>/<\1>\2<\/\1>/' input.xml
-E:开启扩展正则表达式,无需对括号转义([^"]+):精准捕获双引号内的字段名,避免匹配其他属性内容([^<]+):捕获标签内的文本内容(假设内容不含<符号)<\1>\2<\/\1>:将捕获的字段名和内容拼接成目标格式
方法2:使用awk
通过设置多分隔符拆分每行内容,再拼接成目标格式:
awk -F '<Field name="|\" type=\"[^\"]+\">|</Field>' '{print "<"$2">"$3"</"$2">"}' input.xml
-F:指定多个分隔符,将每行拆分为字段名、内容等部分$2对应捕获的字段名,$3对应标签内的文本内容,直接拼接输出目标标签格式
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

