Этот скрипт даст вам то, что вам нужно:
wget --quiet -O - http://bit.ly/rQyhG5 \
| sed -n -e 's!.*<title>\(.*\)</title>.*!\1!p'
Но есть много ситуаций, когда он ломается, в том числе, если в теле страницы есть <title>...</title>
, или если заголовокнаходится на более чем одной строке.
Это может быть немного лучше:
wget --quiet -O - http://bit.ly/rQyhG5 \
| paste -s -d " " \
| sed -e 's!.*<head>\(.*\)</head>.*!\1!' \
| sed -e 's!.*<title>\(.*\)</title>.*!\1!'
, но это не соответствует вашему случаю, так как ваша страница содержит следующее открытие заголовка:
<head profile="http://gmpg.org/xfn/11">
Опять же, это могло бы быть лучше:
wget --quiet -O - http://bit.ly/rQyhG5 \
| paste -s -d " " \
| sed -e 's!.*<head[^>]*>\(.*\)</head>.*!\1!' \
| sed -e 's!.*<title>\(.*\)</title>.*!\1!'
, но есть еще способы сломать его, включая отсутствие заголовка / заголовка на странице.
Опять же, лучшее решение можетбыть:
wget --quiet -O - http://bit.ly/rQyhG5 \
| paste -s -d " " \
| sed -n -e 's!.*<head[^>]*>\(.*\)</head>.*!\1!p' \
| sed -n -e 's!.*<title>\(.*\)</title>.*!\1!p'
но я уверен, что мы сможем найти способ сломать его.Вот почему настоящий xml-синтаксический анализатор - правильное решение, но поскольку ваш вопрос помечен shell
, чем выше, тем лучше, чем я могу его предоставить.
paste
и 2 sed
могут бытьобъединены в один сед, но менее читабельны.Однако эта версия имеет преимущество работы с многострочными заголовками:
wget --quiet -O - http://bit.ly/rQyhG5 \
| sed -n -e 'H;${x;s!.*<head[^>]*>\(.*\)</head>.*!\1!;T;s!.*<title>\(.*\)</title>.*!\1!p}'
Обновление :
Как поясняется в комментариях, в последнем приведенном выше седе используетсяT
команда, которая является расширением GNU.Если у вас нет совместимой версии, вы можете использовать:
wget --quiet -O - http://bit.ly/rQyhG5 \
| sed -n -e 'H;${x;s!.*<head[^>]*>\(.*\)</head>.*!\1!;tnext;b;:next;s!.*<title>\(.*\)</title>.*!\1!p}'
Обновление 2 :
Как указано выше, все еще не работает на Mac, попробуйте:
wget --quiet -O - http://bit.ly/rQyhG5 \
| sed -n -e 'H;${x;s!.*<head[^>]*>\(.*\)</head>.*!\1!;tnext};b;:next;s!.*<title>\(.*\)</title>.*!\1!p'
и / или
cat << EOF > script
H
\$x
\$s!.*<head[^>]*>\(.*\)</head>.*!\1!
\$tnext
b
:next
s!.*<title>\(.*\)</title>.*!\1!p
EOF
wget --quiet -O - http://bit.ly/rQyhG5 \
| sed -n -f script
(обратите внимание на \
перед $
, чтобы избежать переменного расширения.)
Появляется, что :next
ненапример, префикс $
, что может быть проблемой в некоторых версиях sed.