正则表达式不适用于卷曲输出

时间:2018-04-05 17:16:04

标签: regex shell curl grep

我使用curl在debian linux终端发送POST请求并且它正常工作,这是curl命令:

curl --data "ping=8.8.8.8" -s http://www.ipvoid.com/ping/

现在我想通过执行以下命令捕获<textarea>标记之间的内容:

curl --data "ping=8.8.8.8" -s http://www.ipvoid.com/ping/ | grep -ioE '<textarea.*>(.*(\n.*)*)<\/textarea>' 

但它什么也没有回报。我测试了正则表达式并且它正常工作:

regex101.com

正则表达式或grep语法有问题吗?

2 个答案:

答案 0 :(得分:2)

由于关键HTTP请求的结果是HTML文档,正确的方法是应用xml / html解析器。

xmllint 就是其中之一:

curl -d "ping=8.8.8.8" -s http://www.ipvoid.com/ping/ \
| xmllint --html --xpath '//textarea/text()' - 2>/dev/null

输出:

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=61 time=1.12 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=61 time=1.05 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=61 time=1.14 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 1.052/1.107/1.144/0.039 ms

http://xmlsoft.org/xmllint.html

答案 1 :(得分:0)

默认情况下,grep每行单独解析输入,并且textarea中包含换行符,因此你的正则表达式不起作用。但你可以(ab)使用--null-data参数,然后它会将输入分隔为NULL字节而不是换行符,并且因为你的textarea中没有空字节,所以它可以工作!

curl --data "ping=8.8.8.8" -s http://www.ipvoid.com/ping/ | grep -ioE '<textarea.*>(.*(\n.*)*)<\/textarea>' --null-data

(但我建议使用正确的HTML解析器,@ RomanPerekhrest推荐的xmllint可能是更好的解决方案,如果你可以使用的话)