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

11

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

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

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

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

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

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

Ваш Ответ

5   ответов
0
grep -oP "<foo>(.*)</foo>" "XML.xml" | sed -n 's/.*<foo>\([^<]*\)<\/foo>.*/\1/p' >> "foo.txt"
3

Я не могу понять, почему вы хотите использовать для этого 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 как объяснили другие.

Что вы не поняли в (ясном) вопросе, который заканчивается на: "использование grep" ?
Задайте вопрос об апельсинах, и принятый ответ о бананах. Ницца. Вот совет:tips go in comments, а не ответы.
Смотрите такжеstackoverflow.com/questions/15461737/… для каталога инструментов XPath для U * x.
Что вы не поняли в ответе, дающем полезный ответ на вопрос, в котором рассматривается суть проблемы, а не предположения, сделанные ОП. Почему это тебя беспокоит?
Примеры команд, которые поддерживают 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).
18

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

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

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

@ Бхарат устарел ?? Можете ли вы предоставить ссылку?
man perlre - (?<=pattern) это утверждение позади и(?=pattern) это предвидение
но теперь grep -P устарел
моя вина. Согласовано :)
Тот факт, что OSX решил удалить полезные функции, вряд ли указывает на то, что эта функция устарела. Нет никаких указаний на то, что он будет удален из GNUgrep который легко установить на OSX, если вам это нужно, и стандарт для большинства других платформ в наши дни.
1

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

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

3

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

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

Похожие вопросы