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

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中可能不起作用。


2
使用Shell解析HTML是一个不好的想法。 - Gilles Quénot
你正在使用Unix变体,请使用众多可用的语言之一,例如Perl、Python、Ruby等来解析它。 - Augusto
我知道这不是理想的解决方案,但解决这个任务是完成我正在工作的关键。所以是否有某种形式的例如 sed 命令来解决这个问题?只需要一次选择所有这些字符串。 - UncleSam
3个回答

4

我同意sputnick和其他人的观点,但针对你当前的问题,我的回答是:

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

这在您提供的样本数据上运行得很好。


0

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

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

sed -n '//{p; :a; N; /</th>/!ba; s/.*\n//}; p' output.txt

它将删除之间的内容

 <th>...</th> tags

更多信息请参见使用sed删除两个模式之间的行(不包括模式本身)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接