Как найти файл XML и распечатать текст определенного цвета - proUbuntu
1 голос
/ 24 августа 2020

Я пробовал grep, awk, sed и начинаю пробовать xmlstarlet, но не нашел в этом особой поддержки.

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

Мой файл. xml выглядит так:

<p style=" margin-left: 80.0px;">Do not print this.</p>
<p style=" margin-left: 80.0px;"><span style=" color: #595959;">Print this.</span></p>

Я пробовал

$ cat file.xml | grep -oP '(?<=\"<span style="color: #595959;">\").*?(?=\"</span>")'

grep не выводит

sed -n '/span style=" color: #595959/,/<\/span/p'  file.xml

sed возвращает всю строку и после этого продолжает печатать каждую строку в файле xml, но мне нужен только текст между тегами.

awk -F "[><]" '/span style=" color: #595959;"’/{print $3} file.xml

Команда awk выполняется, но не завершается o r печатать что-либо.

xmlstarlet производит:

Unescaped '<' not allowed in attributes values

что относится к другой строке r в файле, но я предполагаю, что это нарушение является причиной остановки xmlstarlet.

1 Ответ

0 голосов
/ 26 августа 2020

Учитывая, что файл. xml неправильно отформатирован xml, вы можете сделать следующее:

grep -o '<span style=\" color: #595959;">.*</span>' file.xml | xmllint --xpath 'string(//span)' -

Часть команды grep найдет всю строку, содержащую вас r желаемый тег диапазона (теги включены). Затем строка передается в xmllint, который будет использовать запрос xpath, чтобы найти ваш текст r. Имейте в виду, что это сработает, если у вас нет нескольких тегов span, соответствующих критериям grep, в одной строке.

Howeve r, если вы правильно сформировали xml, вы можете использовать только xmllint (я просто поместил теги вокруг файла r), который является предпочтительным способом работы с файлами xml. Команда будет выглядеть так:

xmllint --xpath 'string((//span[@style=" color: #595959;"])[1])' file.xml

Обратите внимание на [1] в команде. Это используется, чтобы показать вам первый результат запроса. Если у вас есть несколько тегов span с одинаковым атрибутом стиля, вы можете получить эти тексты, используя [2], [3], et c.

...