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 个不属于该组的 "
组成。它是在正则表达式中找到的第一个组,因此可以在替换部分用
.
引用它
有人可以解释以下 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 个不属于该组的 "
组成。它是在正则表达式中找到的第一个组,因此可以在替换部分用 .