2017-01-26 71 views
0

我嘗試從包含csv的變量中使用awk提取一大堆xml。從csv提取xml

我從吐下了一個Web服務得到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。我希望雙引號只用一個雙引號替代(而不是格式=「」strict「」=> format =「strict」)

現在我有以下但它不能代替double doubel行情的希望:

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

刪除多個雙引號,只要說'tr -s''' fedorqui

+0

增加了我試圖實現的功能,我想提取整個xml代碼,而不是它的一部分 – laloune

+0

所以你只是想清除你通過刪除雙引號得到的字符串的xml部分?另外,'2 ; 1;「'在開始?它們是不變的? – fedorqui

回答

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來考慮任何順序組非空行是一個記錄的特殊值。

+0

謝謝一堆!如果我的數據來自變量而不是直接來自文件?我應該使用像-v變量=「$ etlDefinitionClean」等等? – laloune

+0

在這種情況下,你會說'echo「$ etlDefinitionClean」| awk ...'(並且確保將變量放在引號中以維護換行符)。 – jas

+0

非常感謝! – laloune