如何使用bash脚本删除一行中两个HTML标记之间的字符串

时间:2012-10-18 20:07:34

标签: regex bash

我最近一直在研究一些简单的bash脚本,它解析来自网页的特定数据。我使用tr '\r\n' ' ' <file1.txt >file2.txt来确保从页面中提取的所有数据都存储在一行file1.txt中。因此,我需要匹配此行中<th>...</th>个标记之间的所有字符串,然后将其删除或替换为' '符号。 所以这里有一些expamle代码:

    <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中。

3 个答案:

答案 0 :(得分:4)

虽然我同意sputnick和其他人的意见,但你当前问题的答案是:

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

这对你的样本数据很有用。

答案 1 :(得分:0)

你的尝试似乎是错误的。

您无法使用HTMLXMLBash或{{等实用程序来实际解析基于标记的标记语言,例如grepsed 1}}。如果您只想转储/呈现cut,请参阅HTML(links|links2|lynx|w3m) -dumphtml2text。要解析数据,请参阅vilistextum或了解tidy+(xmlstarlet|xmllint|xmlgawk|xpath|xml2)

答案 2 :(得分:0)

 <td>
     Abaktal hm
 </td>
 <th>
     Package
 </th> 
 <td>
     flm 10x400 mg</td>
 <th> 
     Indesit
 </th>

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

sed -n&#39; // {p; :一个; N; /&LT; /第&GT;!/ BA;小号/.* \ n //}; P&#39; output.txt的

它将删除

之间的内容
 <th>...</th> tags

了解更多信息 removing lines between two patterns (not inclusive) with sed