我如何只提取
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 中使用“&”,这应该没问题。