Bash: вернуть все символы между n-ными вхождениями двух разных строк в строке
В скрипте bash (в Ubuntu 14.04) я запускаю команду:
WP055="$(wget -qO - http://alerts.weather.gov/cap/wwaatmget.php?x=CAZ055&y=1)"
В строке переменной WP055 будет неизвестное число пар "
Я планировал перебирать переменную WP055 x количество раз, анализируя текст в каждой паре тегов, пока не найду правильный.
Я не могу найти WP055 для "по NWS", потому что в WP055 может быть более одного вхождения (несколько рекомендаций в строке WP055).
(Приведенная выше команда wget определенно будет иметь строку "by NWS" во 2-й паре заголовков до 07 марта в 3:00 по тихоокеанскому времени, когда текущее уведомление о ветре будет отменено.)
1 ответ
Немного неполированный, но, похоже, работает:
WP055="$(wget -qO - http://alerts.weather.gov/cap/wwaatmget.php?x=CAZ055&y=1)"
remainder=${WP055#*<title>}
if [ "$WP055" = "$remainder" ]
then
echo "No title found"
exit
fi
while true
do
this_title=${remainder%%</title>*}
if [ "$remainder" = "$this_title" ]
then
echo "</title> not found"
exit
fi
if [[ "$this_title" == *"by NWS"* ]]
then
echo "$this_title contains \"by NWS\""
# You probably want to do something here, like return.
fi
new_remainder=${remainder#*<title>}
if [ "$new_remainder" = "$remainder" ]
then
echo "No more titles"
exit
fi
remainder=$new_remainder
done
remainder=${WP055#*<title>}
это форма раскрытия параметров, которая удаляет соответствующий шаблон префикса. Здесь это устанавливает remainder
в
- Первый заголовок в строке (исключая вступительный
<title>
), - отставание
</title>
, а также - все остальные строки после этого (включая все последующие заголовки).
Если "$WP055" = "$remainder"
это означает, что оболочка не найдена <title>
в строке.
this_title=${remainder%%</title>*}
аналогично устанавливает this_title
быть $remainder
до, но не включая первый </title>
,
if [[ something1 == something2 ]]
с двойными скобками ([[ … ]]
) и двойной знак равенства (==
), соответствует ли шаблон. Все остальное - повторение.
Это может вести себя странно при неправильном вводе; т.е. текст где <title>
а также </title>
не встречаются в чередующихся парах.