我正在学习Bash脚本,需要一些帮助来理解正则表达式.
我有一个变量,基本上是网页的html(使用wget导出):
currentURL = "https://www.example.com"
currentPage=$(wget -q -O - $currentURL)
Run Code Online (Sandbox Code Playgroud)
我想获取此页面中所有链接照片的ID.我只需要帮助搞清楚RegEx应该是什么.
我从这开始,但我需要修改正则表达式:
测试字符串(这是currentURL包含的内容,可以有零到多个实例):
<a href="./download/file.php?id=123456&mode=view"><img src="./download/file.php?id=123456&t=1"></a>
Run Code Online (Sandbox Code Playgroud)
目前的正则表达式:
.\/download\/file.php\?id=[0-9]{6}\&mode=view
Run Code Online (Sandbox Code Playgroud)
这是我创建的正则表达式,但它似乎不适用于bash.
最好的解决方案是拥有每个文件的ID.在这种情况下,简单地说123456.但如果我们可以从获得开始/download/file.php?id=123456,那将是一个良好的开端.
不要使用正则表达式解析HTML,使用适当的XML/HTML解析器.
根据编译理论,HTML无法使用基于有限状态机的正则表达式进行解析.由于HTML的分层结构,您需要使用下推自动机并使用YACC等工具操纵LALR语法.
您可以使用以下之一:
xmllint通常默认安装libxml2,xpath1
xmlstarlet可以编辑,选择,转换...默认情况下不安装xpath1
通过perl的模块XML :: XPath,xpath1安装xpath
xidel xpath3
saxon-lint我自己的项目,包装在@Michael Kay的Saxon-HE Java库中,xpath3
python的lxml(from lxml import etree)
Perl中的XML::LibXML,XML::XPath,XML::Twig::XPath,HTML::TreeBuilder::XPath
currentURL="https://www.example.com"
printf '%s\n' $(xmllint --html --xpath '//a/@href' "$currentUrl" 2>/dev/null) |
grep -oP 'id=\K\d+'
Run Code Online (Sandbox Code Playgroud)
或者用sed:
printf '%s\n' $(xmllint --html --xpath '//a/@href' "$currentUrl" 2>/dev/null) |
sed -E 's/id=([0-9]+)/\1/'
Run Code Online (Sandbox Code Playgroud)
或者单独使用xidel:
xidel -s "$currentURL" -e '//a/extract(@href,"id=(\d+)",1)'
Run Code Online (Sandbox Code Playgroud)
谢谢@Reino
printf仅仅有爆炸的xmllint用换行输出.我们可以使用:xmllint ..... | tr '[[:space:]]' $'\n' | grep -oP 'id=\K\d+'currentURL = "https://www.example.com"=>currentURL="https://www.example.com"