有人能解释一下下面的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来提取数据,而不必使用正则表达式。