3

我最近一直在研究一些简单的bash脚本,它解析网页中的特定数据。我曾经tr '\r\n' ' ' <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.

4

3 回答 3

4

虽然我同意 sputnick 和其他人的观点,但您的直接问题的答案是:

sed -ir 's/<th>[^<]+<\/th>//g'

这适用于您的示例数据。

于 2012-10-19T05:51:51.067 回答
0

您的尝试似乎绝对是错误的。

您无法实际解析基于标记的标记语言,例如HTMLXML使用Bash或实用程序,例如grep,sedcut. 如果您只想转储/渲染HTML,请参阅(links|links2|lynx|w3m) -dump, html2text, vilistextum。要解析数据片段,请参阅tidy+(xmlstarlet|xmllint|xmlgawk|xpath|xml2)或学习xslt

于 2012-10-18T20:11:10.877 回答
0
 <td>
     Abaktal hm
 </td>
 <th>
     Package
 </th> 
 <td>
     flm 10x400 mg</td>
 <th> 
     Indesit
 </th>

如果您有这种类型的输入,则以下命令将起作用

sed -n '//{p; :一个; N; /</th>/!ba; s/.*\n//}; p'输出.txt

它将删除之间的内容

 <th>...</th> tags

有关使用 sed 删除两个模式(不包括在内)之间的线的更多信息

于 2015-08-20T10:31:55.403 回答