我最近一直在研究一些简单的bash
脚本,它解析网页中的特定数据。我使用tr 'rn' ' ' <file1.txt >file2.txt
来确保从页面中提取的所有数据都存储在一行file1.txt
中。因此,我需要匹配此行中<th>...</th>
标签之间的所有字符串并删除它们或替换为' '
符号。 所以这里有一些扩展代码:
<td>Abaktal hm</td> </tr> <tr> <th>Package</th> <td>flm 10x400 mg</td> <th>Indesit</th>
我用过sed
并尝试过类似的东西
sed -i 's/<th>.*?</th>/ /g' output.txt
但它没有用。我认为问题出在?
迹象上。它适用于正则表达式中的?
符号,但可能不适用于bash
。
虽然我同意sputnick和其他人的观点,但你直接问题的答案是:
sed -ir 's/<th>[^<]+</th>//g'
这适用于您的示例数据。
<td>
Abaktal hm
</td>
<th>
Package
</th>
<td>
flm 10x400 mg</td>
<th>
Indesit
</th>
如果您有这种类型的输入,以下命令将起作用
sed -n '//{p; :a;N;//!ba;s/.*//};p' 输出.txt
它将删除之间的内容
<th>...</th> tags
欲了解更多信息 使用 SED 删除两个模式(不包括)之间的线条
你的尝试似乎绝对是错误的。
您无法实际使用Bash
或实用程序(如grep
、sed
或cut
)解析基于标记的标记语言(如HTML
和XML
)。如果只想转储/渲染HTML
,请参阅(links|links2|lynx|w3m) -dump
、html2text
、vilistextum
。有关分析数据片段的信息,请参阅tidy+(xmlstarlet|xmllint|xmlgawk|xpath|xml2)
或了解xslt
。
看
- https://blog.codinghorror.com/parsing-html-the-cthulhu-way/
- 正则表达式匹配开放标签,但 XHTML 自包含标签除外