使用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
有人可以指出我做错了吗?
提前致谢。
答案 0 :(得分:1)
按如下方式更改正则表达式:
sed 's/<|>|h3|\/|span| UTC//g'
substution命令是s/.../.../
,其中第一个省略号(...
)是模式,第二个是替换。
编辑:因为您实际上在询问出现了什么问题,所以这里有一个解释:在正则表达式替换s/<|>|h3|/|span| UTC|.......... /g
中,模式为<|>|h3|
,即。 <
,>
,h3
或一无所获。替换为|span| UTC|..........
,这是您使用-r
选项获得的全部内容。
答案 1 :(得分:0)
最好使用这个简单的awk
命令在h3
和span
标记之间插入文字:
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)
不要使用正则表达式解析HTML。使用支持XPath的工具,例如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