2013-08-29 3 views
0

У меня есть XML-файл, который я хочу извлечь все вхождения некоторого тега AB. Файл - одна длинная строка с ~ 500 000 символов.Соответствие sed regexp в длинной строке

Теперь я знаю о regexp и т. Д., Но когда я пробую его с помощью sed и попытаюсь извлечь только символы из тегов, я полностью потерял результат :).

Вот моя команда:

sed -r 's/(.*)<my_tag>([A-Z][A-Z])<\/my_tag>(.*)/hello\2/g' myfile.out

преобразует весь файл только с "helloAB", например, Хотя ожидаемое должно содержать по меньшей мере 100 матчей.

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

+0

Биты '. *' Съедают все. Вероятно, это исправит проблему использования не жадной версии обоих экземпляров. – abiessu

+0

Это работа для grep, а не sed. –

+2

Для этого вам лучше всего использовать подходящую утилиту для анализа XML, поскольку XML не является обычным языком, поэтому регулярные выражения не являются лучшим инструментом для работы. Возможно, вам удастся выполнить простой анализ XML с помощью регулярных выражений, но, как вы можете видеть уже для этого простого случая, RE, который вам нужно использовать, даже здесь может немного запутаться ... – twalberg

ответ

1

Если у вас есть питон (2.6+), это должно быть довольно тривиально:

import xml.dom.minidom as MD 
tree = MD.parse("yourfile.xml") 
for e in tree.getElementsByTagName("AB"): 
    print e.toprettyxml() 

В общем, пытаясь разобрать XML вручную следует избегать, так как есть более простые решения, как это. Не говоря уже о том, что эти библиотеки позволят вам легко получить доступ к атрибутам и значениям без дальнейшего анализа.

0

Благодарим за ваши ответы.

Я попробовал предложение @ MannyD и, к сожалению, XML, похоже, не был хорошо сформирован, поэтому синтаксический анализ не удался. Поскольку я не могу предвидеть только хорошо сформированные XML, я сделал решение grep, которое выполняет эту работу.

grep -o "<my_tag>[A-Z][A-Z]</my_tag>" myfile.out | sort -u

Флаг -o вариант будет печатать каждый матч на новой линии, откуда я только что-то и напечатать уникальные матчи из файла.

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