linux - 使用 sed 提取 HTML 数据

标签 linux sed awk

如果我有一行 HTML

<td><em>data</em></td>

如何打印到标准输出

<em>data</em>

如果行首和行尾恰好

<td>

</td>

标签准确。如果该行不是以 td 标签开始或结束,则不要打印该行。

我试过了

sed 's/<td>\(*\)</td>/\1/'

但它并不完全有效。
提前致谢。

最佳答案

应该这样做:

echo "<td><em>data</em></td>" | awk '{gsub(/<\/?td>/,x)}8'
<em>data</em>

或者这个:

echo "<td><em>data</em></td>" | sed 's|</*td>||g'
<em>data</em>

或者这样:(更准确地说,因为 ? 只代表一个字符)

echo "<td><em>data</em></td>" | sed 's|</\?td>||g'
<em>data</em>

检查你的工作有什么问题sed 's/<td>\(*\)</td>/\1/' 你快到了,但是这个\(*\)不起作用,因为它现在不重复什么 *
添加一个简单的 .使它有效,因为它代表任何字符。所以应该是\(.*\)
在第二个td有一个正斜杠 / .由于您使用的是 /因为分隔符必须是
像这样逃脱了/\给予 <\/td>所以这是有效的:

echo "<td><em>data</em></td>" | sed 's/<td>\(.*\)<\/td>/\1/g'
<em>data</em>

可以改成:

echo "<td><em>data</em></td>" | sed 's|<td>\(.*\)</td>|\1|g'
<em>data</em>

但是正如你在我上面的例子中看到的,没有必要使用反向引用。最好只是
删除不需要的内容。


如果这个if the beginning and end of the line have exactly意味着行的开始/结束仅此而已。
反向引用:

sed 's|^<td>\(.*\)</td>$|\1|g'

只是删除:

sed 's:^<td>\|</td>$::g' 

awk :

echo "<td><em>data</em></td>" | awk '{gsub(/^<td>|<\/td>$/,x)}8'
<em>data</em>

关于linux - 使用 sed 提取 HTML 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21273646/

相关文章:

vim - 将多行合并为一行

shell - 如何使用 awk 将变量包含到输出文件名

java - 如何使用java、Linux检查是否安装了特定软件

linux - dbus:dbus_bus_get_unique_name 有问题

linux - 如何从 Shell 脚本的配置文件中检索值(不知道 key )

awk - 仅在第一次出现后在模式匹配后追加一行

linux - 多包管理器

shell - sed(1) : prepend a line

linux - 使用 sed 逐行提取 xml 标记的多个参数

awk - 提取边列表中的特定行