Как найти информацию внутри XML-тега с помощью grep?

Я работаю над сценарием оболочки linux, чтобы найти информацию в xml-файле с помощью grep. Я на mac, который, я надеюсь,не имеет большого значения.

чтобы найти нужную мне информацию, я бегу:

grep -oP "<title>(.*)</title>" temp.xml

я получаю взамен список матчей, и это включает в себя <title> тег.

как я могу получить список только с информацией внутри title тегом без the title тег с помощью grep?

4 ответов


Я не понимаю, почему вы хотите использовать grep для этого, в то время как его можно решить с помощью тривиального выражения XPath:

//title/text()

есть много инструментов командной строки для XPath, и они, как правило, в комплекте с ОС.

ответы этот вопрос о переполнении стека перечислите ряд таких инструментов.

проблема с grep вот что это общий инструмент для обработки текста, и он не знает о какой-либо структуре XML. Для очень простого сценария, ты можешь!--15-->она работает. Если документ сложен или вы используете его в сценарии, который будет жить месяцы или годы, а не только одноразовая работа, вы можете в конечном итоге пожалеть о результатах.

XPath позволяет легко определить разницу между одноименными тегами, которые появляются в разных контекстах в документе.

<article>
    <author>
        <name>Jon Doe</name>
        <title>Chief Editor</title>
    </author>
    <title>On the Benefits of grep</title>
    <publicationDate>2018-02-12</publicationDate>
    <text>blah blah blah</text>
</article>

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

/article/title/text()

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


Так как вы уже используете grep -P, почему бы вам не использовать его возможности?

grep -oP '(?<=<title>).*?(?=</title>)'

В общем случае XPath-правильное решение, но для игрушечных сценариев, да, Вирджиния, это можно сделать.


Это не лучшее решение, я бы искал XML lib в bash, но вы можете сделать:

grep -oP "<title>(.*)</title>" temp.xml | cut -d ">" -f 2 | cut -d "<" -f 1

вы можете установить xgrep с помощью xpath, как предложено в Томаответом

человек xgrep