从csv中提取xml

时间:2017-01-26 11:02:18

标签: xml bash csv awk

我尝试从包含csv的变量中使用awk提取一大堆xml。

我从一个吐出以下内容的网络服务中获取了csv:

2;1;"<?xml version=""1.0"" encoding=""UTF-8""?>
<project name=""ETLTasks"" version=""6.0"" modified=""1479827853273"" modifiedBy=""admin"" format=""strict"" olapId=""p0"">
  <headers>
    <header name=""comment"" modified=""1394702840960"" modifiedBy="""">
      <comment><![CDATA[Automated tasks for OLAP Server:
- CubeCopy
- CubeRulesCalc]]></comment>
    </header>
  </headers>
</project>
";

我尝试使用awk来提取xml。我希望双引号只用一个双引号代替(而不是格式=&#34;&#34;严格&#34;&#34; =&gt;格式=&#34;严格&#34;)

现在我有以下内容,但它不会取代双重引号:

etlDefinitionClean=`echo -n "$etlDefinition" | cut -d";" -f3`
etlDefClean="${etlDefinitionClean%\"}"
etlDefClean="${etlDefClean#\"}"
awk -F "\"*;\"*" '{ gsub(/\"\"/, "\"", $2) } {print $2}' "$etlDefClean"  > "$fileOut"

我最终想要实现的目标如下:

<project name="ETLTasks" version="6.0" modified="1479827853273" modifiedBy="admin" format="strict" olapId="p0">
  <headers>
    <header name="comment" modified="1394702840960" modifiedBy="">
      <comment><![CDATA[Automated tasks for OLAP Server:
- CubeCopy
- CubeRulesCalc]]></comment>
    </header>
  </headers>
</project>

并将其放入文件

1 个答案:

答案 0 :(得分:2)

命令

awk -F '^(2;1;")|(";)' -v RS="" -v dq='""' -v q='"' '{gsub(dq,q,$2); print $2}' csvx.data

为您提供所需的结果:

<?xml version="1.0" encoding="UTF-8"?>
<project name="ETLTasks" version="6.0" modified="1479827853273"modifiedBy="admin" format="strict" olapId="p0">
  <headers>
    <header name="comment" modified="1394702840960" modifiedBy="">
      <comment><![CDATA[Automated tasks for OLAP Server:
- CubeCopy
- CubeRulesCalc]]></comment>
    </header>
  </headers>
</project>

使用-v创建引号只是为了避免大量转义。一个等效的命令是:

$ awk -F '^(2;1;")|(";)' -v RS="" '{gsub("\"\"", "\"" ,$2); print $2}' 

-v RS=""是记录分隔符的一个特殊值,它告诉awk将任何连续的非空行集视为单个记录。

相关问题