我尝试从包含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>
并将其放入文件
答案 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将任何连续的非空行集视为单个记录。