sed 解释,以便我可以重新创建一些代码?

sed explanation so I can recreate a bit of code?

有人可以解释以下 sed 命令吗?

title=$(wget -q -O - https://twitter.com/intent/user?user_id=$ID | sed -n 's/^.*<title>\(.*\) on Twitter<.title>.*$//p')
printf "%s\n" "$title"

我尝试(但非常失败)重新创建它,因为我认为我理解代码中发生的事情。所以我写了(好吧,更修改)如下:

data-user-id=$(wget -q -O - https://twitter.com/$Username | sed -n 's/^.*"data-user-id">\([^<]*\)<.*$//p')
printf "%s\n" "$data-user-id"

显然它出错了,因为语法错误或其他原因。但我试图了解发生了什么,所以我可以制作自己的变体。

P.S。由于需要配置所有内容,我不能只使用 API。

假设页面标题是 "foo on Twitter",它从中提取 "foo"。

但请改用 XMLStarlet,因为它允许您指定 XPath 来提取数据,而不必使用正则表达式。

试试这个:

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]*\)".*$//Ip;q}'

128700677

data-user-id 出现在多行中,因此需要 select 一行 data-screen-name=Username

sed 正在使用正则表达式,有 2 个很好的入门教程:

具有不同输出的不同 sed 脚本:

Username="Whosebug"
wget -q -O - https://twitter.com/"${Username}" | sed -n '/data-screen-name=.'"${Username}"'".*data-user-id=/I {p;q}'

data-screen-name="Whosebug" data-name="Stack Overflow" data-user-id="128700677"

-n 指示 sed 不打印任何内容,除非使用 p 命令。

. 表示任何字符。

* 适用于正则表达式中的前一个字符,它表示零个或此字符的任意数量。

.* 表示零个或任意数量的任意字符。

/data-screen-name=.'"${Username}"'".*data-user-id=/ select 包含 data-screen-name= 和任何一个字符 (.) 和 Whosebug" 字符以及零或任意数量的任意字符 (.*) 和 data-user-id=.

/I表示忽略大小写。

{p;q} 是当上述正则表达式为真时执行的命令。 p 打印当前行。 q 退出 sed 脚本。

顶部的第一个 sed 脚本包含一个额外的 s/regex/replacement/ 来清理该行。

使用的附加元素:

^表示行首。

\( ... \)用于定义组。

"\([0-9]*\)" 是一个仅由数字组成的组,由 2 个不属于该组的 " 组成。它是在正则表达式中找到的第一个组,因此可以在替换部分用 .

引用它