1

В скрипте bash (в Ubuntu 14.04) я запускаю команду:

WP055="$(wget -qO - http://alerts.weather.gov/cap/wwaatmget.php?x=CAZ055&y=1)"

В строке переменной WP055 будет неизвестное число пар «<title>» и «</title>». Мне нужно искать в каждой из этих пар строку «по NWS», что означает, что эта конкретная строка содержит время начала и окончания конкретной информации о погоде. Эта найденная строка (все символы между открывающим и закрывающим тегами заголовка) - это то, что я хочу записать в другую переменную, чтобы я мог перетащить ее в файл index.html, который создает скрипт.

Я планировал перебирать переменную WP055 x количество раз, анализируя текст в каждой паре тегов, пока не найду правильный.

Я не могу найти WP055 для «по NWS», потому что в WP055 может быть более одного вхождения (несколько рекомендаций в строке WP055).

(У приведенной выше команды wget определенно будет строка 'by NWS' во 2-й паре заголовков до 07 марта в 3:00 по тихоокеанскому времени, когда текущее уведомление о ветре будет отменено.)

1 ответ1

0

Немного неполированный, но, похоже, работает:

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 remainder до, но не включая первый </title> .

if [[ something1 == something2 ]] , с двойными скобками ([[ … ]]) и двойным знаком равенства (==), соответствует шаблону.  Все остальное - повторение.

Это может вести себя странно при неправильном вводе; т.е. текст, где <title> и </title> не встречаются в чередующихся парах.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .