Regex 正则表达式在curl输出中不工作

Regex 正则表达式在curl输出中不工作,regex,shell,curl,grep,Regex,Shell,Curl,Grep,我在debian linux终端中使用curl发送POST请求,并且它工作正常,这是curl命令: curl --data "ping=8.8.8.8" -s http://www.ipvoid.com/ping/ 现在,我想通过执行以下命令捕获标记之间的内容: curl --data "ping=8.8.8.8" -s http://www.ipvoid.com/ping/ | grep -ioE '<textarea.*>(.*(\n.*)*)<\/textarea>

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

curl --data "ping=8.8.8.8" -s http://www.ipvoid.com/ping/
现在,我想通过执行以下命令捕获
标记之间的内容:

curl --data "ping=8.8.8.8" -s http://www.ipvoid.com/ping/ | grep -ioE '<textarea.*>(.*(\n.*)*)<\/textarea>' 
curl--data“ping=8.8.8.8”-shttp://www.ipvoid.com/ping/ |grep-ioE'(.*(\n.*)'
但它什么也不返回。我测试了正则表达式,它工作正常:


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

由于关键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

默认情况下,grep每行单独解析输入,而textarea中有换行符,因此正则表达式不起作用。但是您可以(ab)使用
--null data
参数,然后它将用null字节而不是换行符来分隔输入,因为您的文本区域中没有null字节,所以它可以工作

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

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

当您的输入是多行字符串时,它可以工作
grep
逐行解析输入。xmllint的答案显然是最好的,但perl是:
perl-0-ne'print for/([\s\s]*?)/gi'
(如果您使用
grep-Pzo”(.*(\n.*))使内部组不捕获(
(?:)
),您的正则表达式也可以工作
但仍要标记exist@zzxyz与
perl
完美配合,这也将返回
。我只想要标记之间的内容。xmllint似乎可以工作,但我想用grep或perl来做这件事,这是可能的,在@zzxyz注释中已经用perl完成了,现在我正在尝试用grep。