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

Я работаю над сценарием оболочки Linux, чтобы найти информацию в файле XML, используяgrep, Я на Mac, который, я надеюсь, не имеет большого значения.

Чтобы найти нужную мне информацию, я запускаю:

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

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

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

 toniedzwiedz28 мая 2012 г., 11:02
Почему вместо этого вы не используете XPath?
 toniedzwiedz28 мая 2012 г., 11:33
Любого из них будет достаточно. Ваш XPath будет настолько простым, насколько это возможно »// title / text () & apos;
 Filype28 мая 2012 г., 11:37
Турецкий, я не знал, что xpath - это инструмент командной строки.
 Filype28 мая 2012 г., 11:30
Это должна быть быстрая работа по написанию сценариев, я бы не хотел тратить на это целую вечность. Можете ли вы порекомендовать хороший инструмент командной строки xpath?
 Filype28 мая 2012 г., 11:32
Похоже, я уже установил xpath5.12 здесь. Нет ручного ввода, хотя

Ответы на вопрос(5)

grep -oP "<foo>(.*)</foo>" "XML.xml" | sed -n 's/.*<foo>\([^<]*\)<\/foo>.*/\1/p' >> "foo.txt"
Решение Вопроса

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

//title/text()

Существует множество инструментов командной строки для XPath, и они обычно связаны с ОС.

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

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

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 как объяснили другие.

 12 февр. 2015 г., 17:46
Что вы не поняли в (ясном) вопросе, который заканчивается на: "использование grep" ?
 01 мар. 2018 г., 17:44
Задайте вопрос об апельсинах, и принятый ответ о бананах. Ницца. Вот совет:tips go in comments, а не ответы.
 12 февр. 2015 г., 18:18
Что вы не поняли в ответе, дающем полезный ответ на вопрос, в котором рассматривается суть проблемы, а не предположения, сделанные ОП. Почему это тебя беспокоит?
 05 сент. 2014 г., 08:49
Примеры команд, которые поддерживают XPath: xgrep (wohlberg.net/public/software/xml/xgrep), xmlgrep (search.cpan.org/dist/XML-Twig/tools/xml_grep/xml_grep) или sgrep (cs.helsinki.fi/u/jjaakkol/sgrep.html).
 10 июн. 2015 г., 10:48
Смотрите такжеstackoverflow.com/questions/15461737/… для каталога инструментов XPath для U * x.

Поскольку вы уже используетеgrep -Pпочему вы не используете его функции?

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

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

 10 июн. 2015 г., 10:10
моя вина. Согласовано :)
 07 июл. 2014 г., 09:48
@ Бхарат устарел ?? Можете ли вы предоставить ссылку?
 23 июл. 2016 г., 08:04
man perlre - (?<=pattern) это утверждение позади и(?=pattern) это предвидение
 07 июл. 2014 г., 08:32
но теперь grep -P устарел
 10 июн. 2015 г., 09:13
Тот факт, что OSX решил удалить полезные функции, вряд ли указывает на то, что эта функция устарела. Нет никаких указаний на то, что он будет удален из GNUgrep который легко установить на OSX, если вам это нужно, и стандарт для большинства других платформ в наши дни.

Вы можете установить xgrep, используя xpath, как указано вТомответ

человек хгреп

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

grep -oP "<title>(.*)</title>" temp.xml | cut -d ">" -f 2 | cut -d "<" -f 1
 Filype28 мая 2012 г., 11:29
Это мое решение для этого тоже.

Ваш ответ на вопрос