Как извлечь целые записи из файла XML, если они содержат определенную строку, используя стандартные инструменты Linux - PullRequest
2 голосов
/ 21 декабря 2011

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

Я изо всех сил пытаюсь сделать это из-за моих очень ограниченных знаний сценариев bash и полного отсутствия знаний о других языках программирования, таких как perl.

У меня есть стандартный доступ пользователей к Linux-блокам (RHEL 4) без возможности получить разрешение на установку чего-либо, чего еще не было.

Используя стандартные инструменты / языки, доступные в этом поле, кто-нибудь может объяснить, как я могу искать конкретную строку и извлечь какие-либо целые записи из файла, который может содержать ее?

например. извлечь целые записи, которые содержат «Смит», из следующего файла.

Пример данных:

<File>
<Product>
<Ref>1</Ref>
<Title>My Life</Title>
<Series>Life Stories</Series>
<Author>John Smith</Author>
<Price>5.99</Price>
</Product>
<Product>
<Ref>2</Ref>
<Title>A Story</Title>
<Author>Fred Bloggs</Author>
<Price>16.99</Price>
</Product>
<Product>
<Ref>3</Ref>
<Title>Book 1</Title>
<Author>Jane Smith</Author>
<Price>10.99</Price>
</Product>
</File>

Требуемый вывод:

<Product>
<Ref>1</Ref>
<Title>My Life</Title>
<Series>Life Stories</Series>
<Author>John Smith</Author>
<Price>5.99</Price>
</Product>
<Product>
<Ref>3</Ref>
<Title>Book 1</Title>
<Author>Jane Smith</Author>
<Price>10.99</Price>
</Product>

То есть все между тегами <Product> </Product> для записей, содержащих строку «Смит».

Записи могут содержать различное количество тегов, но всегда будут заключены в теги <Product> </Product>.

Я ценю, что идеальный результат может быть невозможен каждый раз без использования более специализированных инструментов, но у меня просто нет их в наличии. Все, что сблизит меня, было бы замечательно.

Я думаю, что сценарий будет читать каждую запись в файле, искать строку в каждой записи по очереди и перенаправлять те записи, которые соответствуют выводу. Однако я изо всех сил пытаюсь найти ответ где угодно.

Большое спасибо за любую помощь, которую вы можете предложить. Дэнни

Ответы [ 3 ]

2 голосов
/ 21 декабря 2011

это должно работать для вашего примера:

 awk 'BEGIN{RS="<[/]?Product>"} /Smith/{print "<Product>",$0,"</Product>"}' file
0 голосов
/ 21 декабря 2011

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

 sed -n '/^<Product>/,/^<\/Product>/{H;//{x;/Smith/p}}' file
0 голосов
/ 21 декабря 2011

это должно работать для вашего примера (за исключением дополнительного в начале):

perl -ne 'BEGIN{$/="</Product>\n"} print if /Smith/' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...