Curl 将变量设置为范围内的模式匹配
我的目标 我需要在一个文本范围内匹配两行,这样我就可以使用一行将url设置为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
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