创建bash脚本以将xml文件解析为csv

时间:2014-02-02 06:34:40

标签: xml linux bash 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将位于不同的单元格中。

我有什么方法可以做到这一点吗?

4 个答案:

答案 0 :(得分:4)

您发布了类似于pervious one的查询。我再次建议使用XML解析器。你可以说:

xmlstarlet sel -t -m //List/Job -v @name -o "|" -v @id -n file.xml

它将返回

John|1
Zack|2
Bob|3

获取样本数据。

如果您希望显示,请将输出传输到sedsed "s/|/\t| /"

答案 1 :(得分:2)

尝试这样的事情

#!/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

答案 2 :(得分:1)

使用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

答案 3 :(得分:0)

扩展xmlstarlet方法:

鉴于此xml文件:

<DATA>
  <RECORD>
    <NAME>John</NAME>
    <SURNAME>Smith</NAME>
    <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"