Grep в файле XML - PullRequest
       29

Grep в файле XML

0 голосов
/ 02 апреля 2012

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

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

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

uniqueid  tableid
uniqueid  tableid

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

Ответы [ 5 ]

5 голосов
/ 02 апреля 2012

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

3 голосов
/ 02 апреля 2012
$ xmlstarlet sel -t -m '//field' -v 'concat(normalize-space(uniqueid), " ", normalize-space(tableid))' -n input.xml
account afs
address afs
2 голосов
/ 02 апреля 2012

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

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

0 голосов
/ 03 апреля 2012

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

sed ':a;$!N;/^<uniqueid>/!D;/^<[^>]*>\n*\([^\n<]*\)\n*<[^>]*>\n*<[^>]*>\n*\([^\n<]*\)\n*<[^>]*>/!ba;s//\1 \2\n/;P;D' XML
0 голосов
/ 02 апреля 2012

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

 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 находятся на начальном уровне.

...