Bash Script sed -e - PullRequest
       1

Bash Script sed -e

0 голосов
/ 22 июля 2010
count_items=`curl -u username:password -L "websitelink" | sed -e 's/<\/title>/<\/title>\n/g' | sed -n -e 's/.*<title>\(.*\)<\/title>.*/\1/p' | wc -l`

Выше у меня есть скрипт Bash, который извлекает заголовки из файла XML, но как мне изменить регулярное выражение, чтобы оно извлекало имя заголовка из тега div?

Пример: извлечь заголовок из: <div id="example""><a href="">title</a></div>

Я знаю, что это глупо делать через Bash, но у меня нет выбора, любая помощь будет признательна.

Ответы [ 4 ]

3 голосов
/ 22 июля 2010

Я рекомендую использовать xmlstarlet вместо попытки анализа XML с помощью регулярного выражения.

2 голосов
/ 22 июля 2010

Парсинг XML без парсера уродлив;ТАК толпа всегда настоятельно рекомендует против этого, и люди всегда настаивают на том, чтобы делать это в любом случае.Обычно грубые, особые решения, объединенные с неправильными инструментами, выходят за рамки определенного уровня сложности, и затем эти люди возвращаются к тому, с чего начали.Вы были предупреждены!;)

В другом месте вы упоминаете, что вам нужно сделать это на «простой машине с Linux, на которой ничего не установлено».Хотя вы можете не найти специализированных инструментов синтаксического анализа XML на каждом компьютере с Linux, в наши дни трудно найти тот, на котором не установлен Perl.Или, по крайней мере, awk.Когда вы выходите за пределы того, что вы можете делать с регулярными выражениями в sed, я рекомендую использовать awk или perl для чистого, гибкого и удобочитаемого решения.Использование Perl с «настоящей» библиотекой Perl XML было бы оптимальным, но в крайнем случае вы можете многое сделать с помощью «из коробки» Perl.

0 голосов
/ 22 июля 2010

Использование только Bash:

$ string='<div id="example""><a href="">title</a></div>'
$ pattern='.*>([^<]+)<.*'
$ [[ $string =~ $pattern ]]
$ target=${BASH_REMATCH[1]}
$ echo $target
title

Есть много способов, чтобы это потерпело неудачу. Вот один из них:

$ string='<div id="example""><a href="">title</a>this text will be grabbed instead</div>'

Вы можете продолжать пытаться сделать регулярное выражение более устойчивым:

pattern='.*>([^<]+)</a.*'

но это тяжелая битва. Используйте правильный парсер.

0 голосов
/ 22 июля 2010

Только для примера из одной строки:

echo '<div id="example""><a href="">title</a></div>' | sed -E -n 's/(.*<div.*<a href="">)([^<]*)(<.*<\/div>.*)/\2/p'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...