2017-01-26 5 views
0

Я пытаюсь извлечь целую кучу xml с помощью awk из переменной, которая включает csv.Извлечение xml из csv

Я получаю файл 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. Я бы хотел, чтобы двойные двойные кавычки заменялись только на одну двойную кавычку (вместо format = "" strict "" => format = "strict")

На данный момент у меня есть следующее, но оно не заменяет двойной 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 variable = "$ etlDefinitionClean" и так далее? – laloune

+0

В этом случае вы бы сказали «echo» $ etlDefinitionClean »| awk ... '(и обязательно приложите переменную в кавычках для сохранения новых строк). – jas

+0

благодарит кучу! – laloune

Смежные вопросы