sed解释,这样我就可以重新创建一点代码了



有人能解释一下下面的sed命令吗?

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

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

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

很明显,它出错是因为语法错误或其他什么原因。但我正在努力了解发生了什么,这样我就可以制作自己的变体

另外,我不能仅仅使用API,因为一切都需要配置。

尝试一下:

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}'
128700677

data-user-id存在于多条线路中,因此需要选择data-screen-name=Username所在的线路

sed正在使用正则表达式,有两个很好的教程可以开始:

  • 正则表达式
  • Sed-Bruce Barnett的介绍和教程

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

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

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

.表示任何字符。

*应用于正则表达式中的前一个字符,它意味着零或该字符的任意数量。

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

/data-screen-name=.'"${Username}"'".*data-user-id=/选择包含data-screen-name=和任意一个字符(.)、StackOverflow"字符以及零或任意数量的任意字符(.*)和data-user-id=的行。

/I表示忽略大小写。

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

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

使用的附加元素:

^表示线路的起点。

CCD_ 26用于定义一个组。

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

假设页面的标题是"推特上的foo",它会从中提取"foo"。

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

相关内容

  • 没有找到相关文章

最新更新