我有一个results.txt文件,其结构如下:
Uncharted 3: Javithaxx l Rampant l Graveyard l Team Deathmatch HD (D1VpWBaxR8c)
Matt Darey feat. Kate Louise Smith - See The Sun (Toby Hedges Remix) (EQHdC_gGnA0)
The Matrix State (SXP06Oax70o)
Above & Beyond - Group Therapy Radio 014 (guest Lange) (2013-02-08) (8aOdRACuXiU)
我想创建一个新文件,提取每行最后一个字符中指定的youtube URL ID"8aOdRACuXiU">
我正试图在一个新文件中建立这样的URL:http://www.youtube.com/watch?v=8aOdRACuXiU&hd=1
注意,我添加了&hd=1到我试图被替换的字符串。我尝试过使用Linux反向和剪切,但反向或rev会破坏我的数据。这里最困难的部分是,我的文本文件中的每一行都有带括号的条目,我只关心最后一组括号之间的数据。每一行都有一个可变的长度,所以这也没有帮助。使用grep和.$怎么样在队伍的尽头?
总之,我想从results.txt中提取youtube ID,并将其导出到以下格式的新文件中:http://www.youtube.com/watch?v=8aOdRACuXiU&hd=1
使用awk
:
awk '{
v = substr( $NF, 2, length( $NF ) - 2 )
printf "%s%s%sn", "http://www.youtube.com/watch?v=", v, "&hd=1"
}' infile
它产生:
http://www.youtube.com/watch?v=D1VpWBaxR8c&hd=1
http://www.youtube.com/watch?v=EQHdC_gGnA0&hd=1
http://www.youtube.com/watch?v=SXP06Oax70o&hd=1
http://www.youtube.com/watch?v=8aOdRACuXiU&hd=1
$ sed 's!.*((.*))!http://www.youtube.com/watch?v=1&hd=1!' results.txt
http://www.youtube.com/watch?v=D1VpWBaxR8c&hd=1
http://www.youtube.com/watch?v=EQHdC_gGnA0&hd=1
http://www.youtube.com/watch?v=SXP06Oax70o&hd=1
http://www.youtube.com/watch?v=8aOdRACuXiU&hd=1
这里,.*((.*))
查找一对圆括号的最后一个出现,并捕获这些圆括号内的字符。然后使用1
将所捕获的组插入到URL中。
使用perl一行代码:
perl -lne 'printf "http://www.youtube.com/watch?v=%s&hd=1n", $& if /[^(]+(?=)$)/' file.txt
或多行版本:
perl -lne '
printf(
"http://www.youtube.com/watch?v=%s&hd=1n",
$&
) if /[^(]+(?=)$)/
' file.txt