我已经尝试了所有可能的(据我所知)grep 和 sed 命令的组合,但未能提取具有以下模式的 URL(纯文本的 Google Alert 电子邮件):
"url": "https://www.google.com/url?rct=3Dj\u0026sa=3Dt\u0026url=3Dhtt=
p://abcnews.go.com/US/wireStory/judge-orders-forfeiture-cartel-money-launde=
ring-case-44765120\u0026ct=3Dga\u0026cd=3DCAEYACoTNzAxNDE5ODc4MzMzMTc5OTA4O=
TIaYjdkMGIxMjNmMjc0YWM4ODpjb206ZW46VVM\u0026usg=3DAFQjCNHKeTb3brU2sr0qOpXXJ=
fuW9Nfntg"
显然,我想要提取的是:
http://abcnews.go.com/US/wireStory/judge-orders-forfeiture-cartel-money-laundering-case-44765120
所以我需要提取“url=3D”和“\”之间的内容。
我尝试过各种 grep 和 sed 变体,但没有任何效果。
如果有人能帮助我解决这个问题,我将非常感激。
PS:我知道一旦提取了 URL,我就必须处理 = 字符,但一次只有一个问题:)
答案1
您可以使用如下命令行进行处理:
cat INBOX | sed -z -e 's/=\n//g' | \
sed -e 's/.*u0026url=3D//;t a;d;:a' -e 's/\\u0026ct=3D.*//'
第一步sed
是将“=”结尾的行与其后续行连接起来,从而特别制作有趣的行的单行。
第二步sed
首先通过去除感兴趣的行的头部来减少感兴趣的行,并丢弃没有该头部的任何行,然后去除目标行的尾部部分。
答案2
你可以尝试使用这个命令吗
awk -F"3D" '{print $4}' input.txt | sed "s/\\\u.*//"
答案3
我不确定您如何获取警报,但我将提供一个示例,说明如果警报位于简单的文本文件中,如何执行此操作。我将首先使用 tr 处理“=”,然后将 Pearl Lookarounds 与 grep 一起使用,如下所示......
cat input.txt | tr --delete '=\n'| grep -oP '(?<=url3D).*?(?=\\u0026)' input.txt
使用您的示例的输出是
http://abcnews.go.com/US/wireStory/judge-orders-forfeiture-cartel-money-laundering-case-44765120
答案4
使用 Ralph Rönnquist 的建议解决了问题
cat INBOX | sed -z -e 's/=\r\?\n//g' | \ sed -e 's/.*u0026url=3D//;t a;d;:a' -e 's/\\u0026ct=3D.*//' > output.txt
计算需要很长时间,但它确实可以正确提取 URL。
非常感谢大家的帮助!