Как найти информацию внутри 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, как предложено в Томаответом