在 bash 脚本中(在 Ubuntu 14.04 上),我运行以下命令:
WP055="$(wget -qO - http://alerts.weather.gov/cap/wwaatmget.php?x=CAZ055&y=1)"
在 WP055 变量字符串中,将有未知数量的“<title>”和“</title>”对。我需要在这些对中搜索字符串“by NWS”,这意味着这个特定的字符串包含特定天气预报的开始和结束时间。这个找到的字符串(开始和结束标题标签之间的所有字符)是我希望捕获到另一个变量中的内容,以便我可以将其放入脚本正在构建的 index.html 文件中。
我计划循环遍历 WP055 变量 x 次,分析每对标签内的文本,直到找到正确的文本。
我无法在 WP055 中搜索“by NWS”,因为 WP055 中可能有多个出现这种情况(WP055 字符串中有多个咨询)。
(上述 wget 命令在 3 月 7 日太平洋标准时间凌晨 3 点之前肯定会在第二个标题对中包含“by NWS”字符串,届时当前风力预警将被取消。)
答案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"
,则表示 shell<title>
在字符串中没有找到。
this_title=${remainder%%</title>*}
同样设置this_title
为$remainder
但不包括首先</title>
。
if [[ something1 == something2 ]]
,使用双括号 ( [[ … ]]
) 和双等号 ( ==
) 进行模式匹配。其他都是重复。
对于格式错误的输入,这可能会表现得很奇怪;即文本中的<title>
和</title>
不会交替出现。