如何用Bash提取目标HTML内容?为何捕获<tr>标签失败?
问题原因及解决方案
为什么你的grep脚本抓不到目标<tr>标签?
- grep默认按单行匹配:你的HTML里
<tr>和</tr>之间是多行内容(包含换行、缩进),而grep默认正则模式中,.不会匹配换行符,.*只能匹配当前行内的内容,所以无法匹配跨多行的<tr>...</tr>区块。 - 正则基础模式的局限性:原生grep的基础正则不支持跨行匹配,必须启用特定选项才能处理换行场景。
修复脚本的几种方法
方法1:启用grep的跨行匹配模式
修改grep命令,添加-z选项(将输入视为以null分隔的内容,实现跨行匹配),同时用-oP启用Perl兼容正则(支持非贪婪匹配,避免误匹配多个<tr>区块):
#!/bin/bash HTML_FILE="html_content.html" tr_tag=$(grep -zPo '<tr>.*?blue.*?</tr>' "$HTML_FILE") echo "$tr_tag"
方法2:用sed实现跨行匹配
sed天然支持多行内容处理,用以下命令提取包含blue的<tr>区块:
sed -n '/<tr>/,/<\/tr>/{H;${x;/blue/p;}}' html_content.html
更稳妥的方案:用专门的HTML解析工具
正则处理HTML极易因标签格式变化(比如属性顺序、换行、缩进)失效,推荐用专业工具:
- xmllint(系统自带XML/HTML解析工具):
xmllint --html --xpath '//tr[td[text()="blue"]]/td[1]/a/@href' html_content.html 2>/dev/null
- pup(轻量HTML解析工具,需单独安装):
cat html_content.html | pup 'tr:has(td:contains("blue")) td:first-child a attr{href}'
内容的提问来源于stack exchange,提问作者membersound
相关产品推荐
相关产品推荐

