Bash:返回字符串中两个不同字符串第 n 次出现之间的所有字符

Bash:返回字符串中两个不同字符串第 n 次出现之间的所有字符

在 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>不会交替出现。

相关内容