匹配后有 sed echo 字符串

匹配后有 sed echo 字符串

我需要直接/pbs.twimg.com\/profile_images\/回显后面的字符串。这是我在一些帮助下创建的搜索工具,每个人都推荐sed,但我从来没有真正使用过sed所以我不太明白。但这是脚本:

read -r Username ;\
wget -q -O - https://twitter.com/"${Username}" | \
 sed -n '/data-screen-name=.'"${Username}"'".*data-user-id=/I \
    {s/^.*data-screen-name=.'"${Username}"'".*data-user-id="\([0-9]*\)".*$/\1/Ip;q}'

该脚本对于大多数帐户来说都可以正常工作,但如果该帐户是私人帐户,则它将失败。如果它改为搜索,/pbs.twimg.com\/profile_images\/那么只会出现 ID,并且不会像原始脚本中那样出现不同的变量(这就是为什么它选择带有data-screem-name=I can't use the 的行推特API 因为我将其导出给那些甚至不知道如何获取 API 的人,所以我试图让用户尽可能简单。

我浏览了几篇 SO/SE 帖子,我不相信这是重复的,如果是的话,很抱歉。

编辑 ---- 这不适用于私人配置文件,因为它所在的行不在 HTML 内。经过进一步研究后,我注意到它/pbs.twimg.com\/profile_images\/给出了用户的 ID,并且在私人帐户和开放帐户上都有。

样本数据:
现在,如果我在我的帐户上运行它,它就会起作用,您会看到我的 ID:

Username="thematrix1o1"
717835108540030976

但如果我在私人帐户上运行它,我将得不到 ID(因为线路不存在)

Username="touchmytweets"
.

(报告中没有点,只是空白)

这是我需要找到的图像https://i.stack.imgur.com/WSACJ.jpg 正如你所看到的,她的ID是:726618076633030656
小样本报告
ile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/726618076633030656\/wwYbLwbs_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/726618076633030656\/wwYbLwbs_normal.jpg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/418265825\/1463628965","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"has_extended_profile":false,"default_profile":true,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":n

答案1

您的输出包含任意数量的随机内容以及您感兴趣的一行。选择该行,丢弃除 ID 之外的任何内容并打印结果:

 sed -n '/profile_images/s/.*profile_images\\\/\([0-9]\+\).*/\1/p'

通过在处理完该行后立即退出,可以稍微提高效率。

事实上,这几乎正是原始代码的作用。唯一改变的是使用的正则表达式。

答案2

当我遇到像大海捞针这样的工作时,如果可以的话,我喜欢把它变成面向线条的问题。你也许可以用这样的东西来做到这一点:

$ sed -E 's:[0-9]+:\n&\n:g' filename \
| grep -F -A1 '/pbs.twimg.com\/profile_images\' | tail -1 

这会将任何数字字符串单独占一行,greps 查找您的字符串,然后打印后面的一个。

这真是一个黑客;解析 HTML 的正确方法是使用 HTML 解析器。但它可能可以完成您只需要一根字符串的受控输入的工作。

稍微简洁的方法是使用 awk,如果您经常处理此类事情,那么绝对值得学习。

相关内容