Curl 将变量设置为范围内的模式匹配

Curl 将变量设置为范围内的模式匹配,curl,awk,Curl,Awk,我的目标 我需要在一个文本范围内匹配两行,这样我就可以使用一行将url设置为curl,另一行匹配设置输出文件名。如果其中任何一个模式在该范围内不匹配,那么我只想打印一个错误并继续 示例输入 Non matching lines <article> Non matching lines <h4 class="audio-module-title">A title</h4> Non matching lines <li class="audio-tool

我的目标

我需要在一个文本范围内匹配两行,这样我就可以使用一行将url设置为curl,另一行匹配设置输出文件名。如果其中任何一个模式在该范围内不匹配,那么我只想打印一个错误并继续

示例输入

Non matching lines

<article>
Non matching lines
<h4 class="audio-module-title">A title</h4>
Non matching lines
<li class="audio-tool audio-tool-download"><a href="https://example.com/file.mp3"
</article>

Non matching lines
我认为awk是一个正确的选择,但我很难想出如何做到这一点。我已经能够找到范围并过滤所有匹配线,但我不知道如何处理其余的

awk '/<article>"/,/<\/article/ {if (/<h4 class=/)print } {if (/<li class="audio-tool audio-tool-download">/)print }' inputfile
awk'/“//

当您对初始测试后的输出感到满意时,请删除
echo

太棒了!这肯定解决了问题。非常感谢。当我完成修改现有脚本以利用此功能时,我将与其他人分享。再次感谢您指点方向,Ed。不,您的解决方案非常有效!再次感谢您.
awk '/<article>"/,/<\/article/ {if (/<h4 class=/)print } {if (/<li class="audio-tool audio-tool-download">/)print }' inputfile
$ cat tst.sh
awk '
BEGIN { OFS="\t" }
/<article>/   { f=1 }
/<\/article>/ { f=0 }
f {
    if ( sub(/.*<h4 class="audio-module-title">[[:space:]]*/,"") ) {
        sub(/[[:space:]]*<\/h4>.*/,"")
        if ( title != "" ) {
            printf "Error@%s[%d]: Got title %s but no URL.\n", FILENAME, titleFnr, title | "cat>&2"
        }
        title = $0
        titleFnr = FNR
    }
    else if ( sub(/.*<li class="audio-tool audio-tool-download">[^"]+"/,"") ) {
        sub(/".*/,"")
        url = $0
        if ( title != "" ) {
            print url, title
        }
        else {
            printf "Error@%s[%d]: Got URL %s but no title.\n", FILENAME, FNR, url | "cat>&2"
        }
        title = url = ""
    }
}
END {
    if ( title != "" ) {
        printf "Error@%s[%d]: Got title %s but no URL.\n", FILENAME, titleFnr, title | "cat>&2"
    }
}
' "$1" |
while IFS=$'\t' read -r url title; do
    echo curl "$url" -o "${title}.mp3"
done
$ ./tst.sh file
curl https://example.com/file.mp3 -o A title.mp3