如何使用sed正则表达式提取HTML并修改时间戳?

时间:2015-10-05 21:36:21

标签: html regex sed

使用curl + grep我得到以下输出:

<h3>Serial ID: L322607B2411012</h3>
<span>felipea</span>
<span>2015-10-05 20:06:43 UTC</span>

我是sed-stuff的新手,我想使用sed以获得以下输出:

L322607B2411012
felipea
20:06:43

我写了以下正则表达式以达到结果:

/<|>|h3|/|span| UTC|.......... /g

使用以下文字在http://www.regexr.com/上进行测试:

<h3>Serial ID: L322607B2411012</h3>
<span>felipea</span>
<span>2015-10-05 20:06:43 UTC</span>
<h3>Serial ID: L322607B2411135</h3>
<span>tressino</span>
<span>2015-10-05 19:57:10 UTC</span>

它会根据需要突出显示匹配项(图片:http://snag.gy/0ge60.jpg),但是当我进行真正的测试时它不起作用,请按照命令执行:

curl internalURL | egrep -i '(utc|Serial ID:|tressino|felipea)' | sed 's/<|>|h3|/|span| UTC|.......... /g'

上面的命令返回正常输出,与没有sed + regex相同。

转义斜杠会返回以下错误:

sed 's/<|>|h3|\/|span| UTC|.......... /g'
sed: -e expression #1, char 35: unterminated `s' command

有人可以指出我做错了吗?

提前致谢。

3 个答案:

答案 0 :(得分:1)

按如下方式更改正则表达式:

sed 's/<|>|h3|\/|span| UTC//g'

substution命令是s/.../.../,其中第一个省略号(...)是模式,第二个是替换。

编辑:因为您实际上在询问出现了什么问题,所以这里有一个解释:在正则表达式替换s/<|>|h3|/|span| UTC|.......... /g中,模式为<|>|h3|,即。 <>h3或一无所获。替换为|span| UTC|..........,这是您使用-r选项获得的全部内容。

答案 1 :(得分:0)

最好使用这个简单的awk命令在h3span标记之间插入文字:

awk -F '</?(span|h3)>' '{print $2}' file
Serial ID: L322607B2411012
felipea
2015-10-05 20:06:43 UTC
Serial ID: L322607B2411135
tressino
2015-10-05 19:57:10 UTC

PS:管道到另一个以获得所需的输出:

awk -F '</?(span|h3)>' '{print $2}' file | awk '/ID:/{print $3;next} / UTC/{print $2;next} 1'
L322607B2411012
felipea
20:06:43
L322607B2411135
tressino
19:57:10

但请记住,awk/sed/grep等不是解析HTML文本的最佳工具。

答案 2 :(得分:0)

TL; DR

不要使用正则表达式解析HTML。使用支持XPath的工具,例如XmlStarlet

使用XmlStarlet的示例

给出格式良好的输入,例如:

<html>
  <body>
    <h3>Serial ID: L322607B2411012</h3>
    <span>felipea</span>
    <span>2015-10-05 20:06:43 UTC</span>
    <h3>Serial ID: L322607B2411135</h3>
    <span>tressino</span>
    <span>2015-10-05 19:57:10 UTC</span>
  </body>
</html>

您可以使用XPath提取所需的文本节点。例如:

$ xmlstarlet sel -t -v '//h3/text() | //span/text()' -n /tmp/foo.html
Serial ID: L322607B2411012
felipea
2015-10-05 20:06:43 UTC
Serial ID: L322607B2411135
tressino
2015-10-05 19:57:10 UTC

然后你可以使用sed或awk来破坏时间戳并将输出分解为记录。作为一个例子,考虑这个单线:

$ xmlstarlet sel -t -v '//h3/text() | //span/text()' -n /tmp/foo.html |
    awk '/UTC$/ {print $2 "\n"; next}; {print}'
Serial ID: L322607B2411012
felipea
20:06:43

Serial ID: L322607B2411135
tressino
19:57:10