从特定模式中提取 URL(Google 警报)

从特定模式中提取 URL(Google 警报)

我已经尝试了所有可能的(据我所知)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。

非常感谢大家的帮助!

相关内容