Grep в файле XML

Мне нужно найти некоторые шаблоны из XML-файла, но я не могу этого сделать.

<field>
<uniqueid>account
</uniqueod>
<tableid>afs</tableid>
</field>
<field>
<uniqueid>address</uniqueod>
<tableid>afs</tableid>
</field>

что мне нужно сделать, это найти записи между этими двумя полями и перенаправить их в файл .txt.and вывод должен быть таким, чтобы

uniqueid  tableid
uniqueid  tableid

то есть для каждого уникального идентификатора tableid должен быть напечатан вместе с ним. Записи могут быть разными или одинаковыми. Ребята помогите...


person Nishant    schedule 02.04.2012    source источник
comment
<uniqueid></uniqueod> имена тегов не совпадают?   -  person kev    schedule 02.04.2012


Ответы (4)


Это потому, что вы не должны использовать grep для этого. Вместо этого попробуйте XSLT или XMLStarlet.

person Ignacio Vazquez-Abrams    schedule 02.04.2012
comment
Если вы хотите найти файл, вы должны использовать XPath. Если вы хотите преобразовать файл, вы должны использовать XSLT. grep, sed и друзья могут быть достаточно хороши для одноразовых быстрых и грязных... но для чего-то большего вы очень быстро наткнетесь на стену. ПО МОЕМУ МНЕНИЮ... - person paulsm4; 02.04.2012

Согласитесь, grep (и другие «стандартные» текстовые инструменты вроде awk, sed и др.) — не лучшее решение проблемы.

Однако что-то вроде того, что вы хотите сделать, можно сделать с помощью awk: https://stackoverflow.com/a/9881009/857132

person John3136    schedule 02.04.2012

@ignacio прав. Но все же, если вы хотите попробовать некоторые грязные хаки. Вот один из них, специфичный для вашего файла:

 grep -e "uniqueid" -e "tableid" sample.xml | sed -e 's/<[^>]*>//g' | sed -e '/^$/d' | sed 'N; s/\n/ /'

 account afs12
 address afs34

Ваш файл "sample.xml" с исправленными тегами (uniqueod был неправильным) и некоторыми данными:

<field>
<uniqueid>account
</uniqueid>
<tableid>afs12</tableid>
</field>
<field>
<uniqueid>address</uniqueid>
<tableid>afs34</tableid>
</field>

Объяснение:

grep -e "uniqueid" -e "tableid" sample.xml  -> find the tags and data
sed -e 's/<[^>]*>//g'             -> remove the tags,only data remains  
sed -e '/^$/d'                    -> remove any empty line i.e. which came due to closing tags
sed 'N; s/\n/ /'                  -> append alternate lines

Могли бы быть и лучшие способы, но мои знания sed и awk находятся на уровне новичка.

person DhruvPathak    schedule 02.04.2012

Это может сработать для вас:

sed ':a;$!N;/^<uniqueid>/!D;/^<[^>]*>\n*\([^\n<]*\)\n*<[^>]*>\n*<[^>]*>\n*\([^\n<]*\)\n*<[^>]*>/!ba;s//\1 \2\n/;P;D' XML
person potong    schedule 02.04.2012