在Bash/Unix中用sed/awk/xmllint关联XML节点值生成CSV
用Unix工具提取XML中与/生成CSV
给定目标XML结构,需将<cod>节点的值与每个<Letture>节点下的<data>值配对,生成分号分隔的CSV行,以下是三种可行实现方案:
方法一:xmllint(推荐,XML专用工具)
利用xmllint的XPath查询能力精准处理XML,避免正则匹配的局限性:
# 先提取<cod>的值并去除多余空白 COD=$(xmllint --xpath 'string(//cod)' input.xml | xargs) # 遍历所有<Letture>/<data>值,拼接成CSV行 xmllint --xpath '//Letture/data/text()' input.xml | xargs -I {} echo "$COD;{}"
方法二:awk(文本处理方案)
若环境无XML专用工具,可借助awk基于固定格式提取内容,创建脚本文件extract_csv.awk:
# 提取并清洗<cod>节点值 /^[[:space:]]*<cod>/ { gsub(/<\/?cod>/, "", $0) gsub(/^[[:space:]]+|[[:space:]]+$/, "", $0) cod = $0 } # 标记进入<Letture>节点范围 /^[[:space:]]*<Letture>/ { in_letture = 1 } /^[[:space:]]*<\/Letture>/ { in_letture = 0 } # 在<Letture>内提取<data>并拼接输出 in_letture && /^[[:space:]]*<data>/ { gsub(/<\/?data>/, "", $0) gsub(/^[[:space:]]+|[[:space:]]+$/, "", $0) print cod ";" $0 }
执行命令:
awk -f extract_csv.awk input.xml
方法三:sed(轻量文本替换)
适合XML结构简单固定的场景,快速实现提取拼接:
# 提取<cod>的值 COD=$(sed -n 's/.*<cod>\(.*\)<\/cod>.*/\1/p' input.xml | xargs) # 在<Letture>块内提取<data>并拼接输出 sed -n '/<Letture>/,/<\/Letture>/ s/.*<data>\(.*\)<\/data>.*/'"$COD;\\1"'/p' input.xml | xargs
内容的提问来源于stack exchange,提问作者Tisagono
相关产品推荐
相关产品推荐

