我如何只提取
http://www.youtube.com/watch?v=qdRaf3-OEh4
Run Code Online (Sandbox Code Playgroud)
从一个 URL 像
http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main
Run Code Online (Sandbox Code Playgroud)
我只对“v”参数感兴趣。
Run*_*ium 14
更新:
更好的是:
sed 's/^.\+\(\/\|\&\|\?\)v=\([^\&]*\).*/\2/'
awk 'match($0,/((\/|&|\?)v=)([^&]*)/,x){打印 x[3]}'
grep -Po '(?<=(\/|&|\?)v=)[^&]*'
# 说匹配 / 或 & 然后 v=
RFC 3986规定:
URI = 方案 ":" hier-part [ "?" 查询] [“#”片段]
查询 = *( pchar / "/" / "?" )
片段 = *( pchar / "/" / "?" )
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
未保留 = ALPHA / DIGIT / "-" / "." / "_" / "~"
子delims =“!” / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="
…
所以为了安全使用:
| sed 's/#.*//' | - to remove #fragment part
Run Code Online (Sandbox Code Playgroud)
在前。
IE
| sed 's/#.*//' | grep -Po '(?<=(\/|&)v=)[^&]*'
Run Code Online (Sandbox Code Playgroud)
回声'http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main' \ | sed 's/^.\+\Wv=\([^\&]*\).*/\1/'
解释:
的
/…/…/ /这个/和这个/
'替换/匹配 0 或更多的东西并将它们分组在 ()/WITH THIS/
+------------------------- s _s_ubsite
|+------------------------- / 开始比赛
|| +---- / 比赛结束
|| | +-- \1 替换为 - \1==第 1 组。或 FIRS 低 ()。
|| | | +- / 替换结束
s/^.\+\Wv=\([^\&]*\).*/\1/'
+++-+-+-+-+-----+-+------- ^ 从行首开始匹配
++-+-+-+-+-----+-+------- 。匹配任何字符
+-+-+-+-+-----+-+------- \+ 多次(grep (grep (greedy +, * *? etc))
+-+-+-+-----+-+------- \W 非字字符
+-+-+-----+-+------- v= 字面上匹配“v=”
+-+-----+-+------- \( 开始比赛组
+-----+-+------- [^\&]* 匹配任意字符但 & - 尽可能多
++------- \) 结束比赛组
+------- .* 匹配任何内容;*尽可能多次
- 又名到行尾;因为没有
[abc] 将匹配 a OR b OR c
[abc]* 将匹配 a AND/OR b AND/OR c - 尽可能多次
[^abc] 将匹配任何但 a,b 或 c
/\1/ 用 MATCH GROUP 编号 1 替换整个匹配项。
那将是 - \( 和 \) 之间的所有内容 - 除了“&”之外他什么都没有
在文字字符串“v=”之后 - 它又包含一个非单词字母
它的前面。
这也意味着没有匹配意味着没有替换,最终导致
没变。
结果: qdRaf3-OEh4
注意:如果没有匹配将返回整个字符串。
回声'http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main' \
| awk 'match($0,/(\Wv=)([^&]*)/,v){打印 v[2]}'
结果: qdRaf3-OEh4
解释:
在 Awk 中match(string, regexp)是一个函数,它在字符串中搜索最长、最左边的正则表达式匹配项。这里我使用了 Gawk 自带的一个扩展。(参见Awk、GAwk; MAwk 等)将单个匹配项 - 即:括号之间的内容 - 放在匹配数组中。
该模式与下面的 Perl/Grep 非常相似。
+-------------------------------------- 内置功能
| +--------------------------------- 整个输入($1 将被提交 1)
| | 等(使用默认分隔符“”*)
| |
| |
| | (..)(....) ------------------ 将 \Wv= 放在第 1 组中,将 [^&]* 放在第 2 组中。
match($0, /(\Wv=)([^&]*)/, v){打印 v[2]}
| | | |
| | ++---- 使用来自 /, v 的 "v"; v 是用户定义的名称
| | +---- 2 指定 v 中的索引,即 group from
| | /…/ 中的 () 之间是什么
| |
| +----------- 打印是另一个内置函数。
+-------------- 可用于打印的组名。
回声'http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main' | \ grep -Po '(?<=\Wv=)[^&]*'
结果: qdRaf3-OEh4
解释:
-P 使用 Perl 兼容
-o 只打印表达式的匹配项。
- 这意味着:我们的模式只打印/返回匹配的内容。
如果没有匹配项;什么都不回。
+------- ^ 否定数学到 - 不匹配(仅因为它是 [] 之间的第一个)
|+------ & 文字“&”字符
||
(?<=\Wv=)[^&]*
| | | | ||
| | | | |+---- * 贪婪;尽可能多的次数。
| | | +---+----- [] 狂野顺序/里面的任何顺序 []
| | +----------- v= 文字 v=
| +------------ \W 非字字符
+----------------- (?<= 后面应该是(中间)前面的。
?=嗯,<=左,==等于
所以:匹配文字 "v=" 其中 "v" 前面是一个非单词字符。然后匹配
任何事物; 尽可能多次,直到我们到达行尾或遇到“&”。
由于您不能在键/值对之间的 URL 中使用“&”,这应该没问题。
| 归档时间: |
|
| 查看次数: |
2031 次 |
| 最近记录: |