如何使用grep/sed/awk提取含指定class的HTML article标签内容
原命令失效原因
你写的命令存在3处逻辑错误:
- 类名拼写错误:目标类名是双短横的
article--nyheter,你写成了单短横的article-nyheter - 匹配范围限制错误:正则开头的
^强制要求内容出现在行首,你把所有换行替换为空格后整个页面是单行长文本,目标article标签并不在文本最开头,自然匹配不到 - 没有准确匹配闭合标签:原正则的
.*会一直匹配到文本末尾,无法单独截取单个article标签的完整内容
可用实现方案
使用带Perl正则支持的grep即可完成需求,命令如下:
处理本地已保存的news.html文件
tr '\n' ' ' < news.html | grep -oP '<article[^>]*class="[^"]*article--nyheter[^"]*"[^>]*>.*?</article>'
直接拉取页面并提取内容(无需保存本地文件)
curl -s https://www.tv2.no/nyheter | tr '\n' ' ' | grep -oP '<article[^>]*class="[^"]*article--nyheter[^"]*"[^>]*>.*?</article>'
命令参数说明
tr '\n' ' ':将所有换行符替换为空格,避免标签被换行拆分导致匹配失败,和你原方案的处理逻辑一致grep -P:开启Perl正则支持,可使用非贪婪匹配语法grep -o:仅输出匹配到的片段,而非整个单行文本- 正则中
.*?为非贪婪匹配,会匹配到最近的</article>闭合标签,避免把多个article的内容合并 - 类名匹配部分写为
[^"]*article--nyheter[^"]*,适配article标签存在多个类名、article--nyheter在任意位置的场景
内容的提问来源于stack exchange,提问作者mohsinali1317
相关产品推荐
相关产品推荐

