2017-01-11 3 views
-2

У меня есть XML-файл, который выглядит, как этотИзвлечение XML данных в Баш

<Module> 
    <Name>VEG</Name> 
     <Property Name="Carrot" Value="Orange" /> 
     <Property Name="Cabbage" Value="Green" /> 
     <Property Name="Tomato" Value="Red" /> 
</Module> 

<Module> 
    <Name>FRUITS</Name> 
     <Property Name="Apple" Value="Red" /> 
     <Property Name="Mango" Value="Yellow" /> 
</Module> 

Как создать выходной файл, используя Bash скрипт, так что выход выглядит

VEG 
    Carrot; Orange, 
    Cabbage; Green, 
    Tomato; Red 
FRUITS 
    Apple; Red, 
    Mango; Yellow 
+0

Вы пробовали команды grep/sed и аналогичные тексты? Задайте конкретный вопрос, если у вас возникли проблемы с этими командами. –

+5

Еще лучше, используйте инструмент, предназначенный для обработки XML, например 'xmllint' или' xmlstarlet'. –

ответ

0

@InnocentSpirit: Попробуйте:

awk '{sub(/" \/>\n<\/Module/,"",$2);gsub(/^\n| +<Name>|<\/Name>|<Property Name="| \/>|>$/,"",$2);gsub(/" Value="/,"; ",$2);gsub(/" \/>/,",",$2);print $2} ' RS= FS="<Module>" Input_file 

Добавление неодномерной формы вкладыша слишком в то же самое, вы можете запустить его в режиме сценария тоже.

awk '{ 
     sub(/" \/>\n<\/Module/,"",$2); 
     gsub(/^\n| +<Name>|<\/Name>|<Property Name="| \/>|>$/,"",$2); 
     gsub(/" Value="/,"; ",$2); 
     gsub(/" \/>/,",",$2); 
     print $2 
    } 
    ' RS= FS="<Module>" Input_file 

Выход будет следующим.

VEG 
     Carrot; Orange, 
     Cabbage; Green, 
     Tomato; Red 
FRUITS 
     Apple; Red, 
     Mango; Yellow 

EDIT: Объяснение выше кода тоже.

awk '{ 
     sub(/" \/>\n<\/Module/,"",$2);         ## substituting pattern space /> new line then </Module> to NONE in $2, here $2(field 2) will be not usual one as I have mentioned RS equals to none and FS equal to <Module> 
     gsub(/^\n| +<Name>|<\/Name>|<Property Name="| \/>|>$/,"",$2); ## globally substituting (a line which is starting with a new line OR <Name> starting with a space OR <\/Name> OR <Property Name=" OR \/ of $2 to NULL) 
     gsub(/" Value="/,"; ",$2);          ## globally substituting (Value=") to "; " in field 2. 
     gsub(/" \/>/,",",$2);           ## gobally substituting (" \/>) to (,) in $2 only. 
     print $2              ## printing the new edited $2 because we have done this editing as per OP's requirement so printing the new field 2. 
    } 
    ' RS= FS="<Module>" file02           ## Mentioning RS(record separator) to NULL and FS as string <Module> and mentioning the Input_file then. 
+0

Спасибо - мое требование немного изменилось, так как я разместил вопрос выше, и я нашел решение своей проблемы с помощью комбинации grep/awk - даст вам решение попробовать и сообщит вам результат - будет полезно знать. – Innocentspirit

+0

Он отлично работает для меня, чтобы получить этот выход, когда я его протестировал. – RavinderSingh13

+0

Прекрасно работает для меня! – Innocentspirit

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