Как извлечь атрибуты xml с помощью (g) awk - PullRequest
0 голосов
/ 28 июня 2019

Итак, у меня есть пример строки xml, который читается из

<element attr1=”XX” attr2=”0818820\.x11” attr3=”YYXX.x11” attr-4=”1”/>

Поскольку это xml, порядок элементов является случайным, а некоторые могут быть необязательными.

Итак, с помощью awk я попытался выбрать один из них, скажем, attr1, используя gensub.

while (getline < "./file") {
    print $0
    #First attempt
    #print gensub(/.*attr1=\"(.*)\".*/,"\\1","g",$0)
    #Second attempt
    print gensub(/.*attr1="(.*)".*/,"\\1","g",$0)
}

Тем не менее, мне не удалось сопоставить это, но вся строка возвращается (возможно, нет совпадения, но это может быть совпадение и для всех). У кого-нибудь есть идея? Я не смогу изменить входные аргументы.

BR Patrik

Ответы [ 2 ]

0 голосов
/ 30 июня 2019

Нет причин изобретать велосипед. документация gawk-xml упоминает несколько xml-анализаторов для awk, например, скрипт getXML Яна Вебера (плавая по интернетам, я нашел его здесь ). Тестирование это произвело:

$ awk -f getXML.awk test.xml
TAG element
        attr-4=”1”
        attr1=”XX”
        attr2=”0818820\.x11”
        attr3=”YYXX.x11”
END element
0 голосов
/ 29 июня 2019

Предполагая, что входные данные находятся в файле file.txt

$ cat file.txt
<element attr1=”XX” attr2=”0818820\.x11” attr3=”YYXX.x11” attr-4=”1”/>

, затем используйте grep для извлечения атрибутов, а затем разделите на =.Следующее:

$  egrep -o "attr[0-9]+[^ ]* " file.txt | awk -F= '{print $1"\t"$2}'
attr1   ”XX” 
attr2   ”0818820\.x11” 
attr3   ”YYXX.x11” 

Если вы хотите только attr1, также выберите attr1:

$  egrep -o "attr[0-9]+[^ ]* " file.txt | awk -F= '/attr1/{print $2}'
”XX” 

Вы можете настроить строку grep для других атрибутов.Например, если вы хотите получить атрибут конца, вставка пробела упрощает логику:

$ sed < file.txt 's|/| |g' | egrep -o "attr[^ ]* "
attr1=”XX” 
attr2=”0818820\.x11” 
attr3=”YYXX.x11” 
attr-4=”1” 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...