[英]Creating bash script to parse xml file to csv
我正在尝试创建一个bash脚本来解析xml文件并将其保存到csv文件。
例如:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<List>
<Job id="1" name="John/>
<Job id="2" name="Zack"/>
<Job id="3" name="Bob"/>
</List>
我希望脚本将信息保存到这样的csv文件中:
John | 1
Zack | 2
Bob | 3
名称和ID将在其他单元格中。
有什么办法可以做到吗?
你已经张贴类似的查询透水一个 。 我再次建议使用XML解析器。 你可以说:
xmlstarlet sel -t -m //List/Job -v @name -o "|" -v @id -n file.xml
它会回来
John|1
Zack|2
Bob|3
为您的样本数据。
如果希望像示例中那样显示输出,请将其通过管道传递到sed
: sed "s/|/\\t| /"
。
试试这个
#!/bin/bash
while read -r line; do
[[ $line =~ "name=\""(.*)"\"" ]] && name="${BASH_REMATCH[1]}" && [[ $line =~ "Job id=\""([^\"]+) ]] && echo "$name | ${BASH_REMATCH[1]}"
done < file
与John
的台词格式错误。 固定后,示例输出
John | 1
Zack | 2
Bob | 3
使用sed
sed -nr 's/.*id=\"([0-9]*)\"[^\"]*\"(\w*).*/\2 | \1/p' file
另外,基于BroSlow的版本,我合并了选项。
#!/bin/bash
while read -r line; do
[[ $line =~ id=\"([0-9]+).*name=\"([^\"|/]*) ]] && echo "${BASH_REMATCH[2]} | ${BASH_REMATCH[1]}"
done < file
扩展xmlstarlet方法:
给定此xml文件作为输入:
<DATA>
<RECORD>
<NAME>John</NAME>
<SURNAME>Smith</SURNAME>
<CONTACTS>
"Smith" LTD,
London, Mtg Str, 12,
UK
</CONTACTS>
</RECORD>
</DATA>
这个脚本:
xmlstarlet sel -e utf-8 -t \
-o "NAME, SURNAME, CONTACTS" -n \
-m //DATA/RECORD \
-o "\"" \
-v $"str:replace(normalize-space(NAME), '\"', '\"\"')" -o "\",\"" \
-v $"str:replace(normalize-space(SURNAME), '\"', '\"\"')" -o "\",\"" \
-v $"str:replace(normalize-space(CONTACTS), '\"', '\"\"')" -o "\",\"" \
-o "\"" \
-n file.xml
您将获得以下输出:
NAME, SURNAME, CONTACTS
"John", "Smith", """Smith"" LTD, London, Mtg Str, 12, UK"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.