如果我有一行 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/