我如何只提取
http://www.youtube.com/watch?v=qdRaf3-OEh4
来自类似
http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main
我只对“v”参数感兴趣。
答案1
更新:
更好的是:
sed's/^.\+\(\/\|\&\|\?\)v=\([^\&]*\).*/\2/' awk'匹配($0,/((\/|&|\?)v=)([^&]*)/,x){print x[3]}' grep -Po'(?<=(\/|&|\?)v=)[^&]*' # 说匹配 / 或 & 然后 v=
RFC 3986状态:
URI = 方案“:” hier-part [“?”查询] [“#”片段] 查询 = *(pchar /“/”/“?”) 片段 = *(pchar/“/”/“?”) pchar = 未保留 / pct 编码 / 子分隔符 /“:” /“@” 未保留 = ALPHA / DIGIT /“-” /“。” /“_” /“~” 子分隔符 = “!”/“$”/“&”/“'”/“(”/“)” /“*”/“+”/“,”/“;” / "=" …
因此为了安全使用:
| sed 's/#.*//' | - to remove #fragment part
在前。
IE
| sed 's/#.*//' | grep -Po '(?<=(\/|&)v=)[^&]*'
独立经济专家 (2):
回显'http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main' \ | sed's/^.\+\Wv=\([^\&]*\).*/\1/'
解释:
的 /…/…/ /这个/和这个/ '替换/匹配 0 个或更多项并将它们分组到 ()/用这个/ +-------------------------- s _s_ubsititute |+------------------------- / 开始比赛 || +---- / 结束比赛 || | +-- \1 替换为 - \1==Group 1。或 FIRS 低()。 || | | +- / SUBSTITUTE 结束 s/^.\+\Wv=\([^\&]*\).*/\1/' +++-+-+-+-+-----+-+------- ^ 从行首匹配 ++-+-+-+-+-----+-+------- . 匹配任意字符 +-+-+-+-+-----+-+------- \+ 多次 (grep (greedy +, * *? 等)) +-+-+-+-----+-+------- \W 非单词字符 +-+-+-----+-+------- v= 字面匹配“v=” +-+-----+-+------- \(开始匹配组 +-----+-+------- [^\&]* 匹配任意字符,但 & 除外 - 尽可能多 +-+------- \) 结束匹配组 +------- .* 匹配任意内容;*尽可能多次 - 又称到行尾;因为没有 [abc] 将匹配 a 或 b 或 c [abc]* 将尽可能多次匹配 a AND/OR b AND/OR c [^abc] 匹配除 a、b 或 c 之外的任何内容 /\1/ 将整个匹配项替换为匹配组 1。 那将是 - \( 和 \) 之间的所有内容 - 除了“&” 在字符串“v=”之后——其中又有一个非单词字母 在它的前面。 这也意味着没有比赛就不能换人,最终导致 不用找了。
结果:qdRaf3-OEh4
注意:如果没有匹配全部的将返回字符串。
(G)AWK:
回显'http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main' \ | awk ‘匹配($0,/(\Wv=)([^&]*)/,v){print v[2]}’
结果:qdRaf3-OEh4
解释:
在 Awk 中match(string, regexp)
有一个函数用于搜索字符串中最长、最左边的正则表达式匹配项。这里我使用了 Gawk 附带的一个扩展。(请参阅awk 的,韋克;MAwk 等)将各个匹配项(即括号之间的内容)放置在匹配项数组中。
该模式与下面的 Perl/Grep 模式非常相似。
+----------------------------------------- 内置函数 | +--------------------------------- 全部输入($1 将被归档为 1) | | 等(使用默认分隔符“ “*) | | | | | | (....)(....) ------------------ 将 \Wv= 放在第 1 组,将 [^&]* 放在第 2 组。 匹配($0,/(\Wv=)([^&]*)/,v){打印 v[2]} | | | | | | +-+---- 使用 /,v 中的“v”;v 是用户定义的名称 | | +---- 2 指定 v 中的索引,它是来自的组 | | /…/ 中 () 之间是什么 | | | +----------- 打印是另一个内置函数。 +--------------- 可在打印中使用的组名。
GREP(使用 Perl 兼容):
回声'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 中的键/值对之间不能有“&”,所以这应该没问题。
答案2
echo 'http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main' | sed -e 's/&.*//' -e 's/.*watch?//'
会得到你v=qdRaf3-OEh4
。