2

我有一个以这种格式构造的 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)

我想创建一个新文件,提取每行“8aOdRACuXiU”中最后一个字符中指定的 youtube URL ID

我正在尝试在新文件中构建这样的 URL: http ://www.youtube.com/watch?v=8aOdRACuXiU&hd=1

请注意,我将 &hd=1 附加到要替换的字符串中。我曾尝试使用 Linux reverse and cut 但 reverse 或 rev munges 我的数据。这里最难的部分是我的文本文件中的每一行都有带括号的条目,我只关心获取最后一组括号之间的数据。每行都有可变长度,所以这也无济于事。在行尾使用 grep 和 .$ 怎么样?

总之,我想从 results.txt 中提取 youtube ID 并将其导出到以下格式的新文件:http ://www.youtube.com/watch?v=8aOdRACuXiU&hd=1

4

3 回答 3

2

使用awk

awk '{ 
  v = substr( $NF, 2, length( $NF ) - 2 )
  printf "%s%s%s\n", "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
于 2013-03-13T17:28:35.287 回答
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

在这里,.*(\(.*\))查找最后出现的一对括号,并捕获这些括号内的字符。然后使用 将捕获的组插入到 URL 中\1

于 2013-03-13T17:20:10.937 回答
1

使用单线:

perl -lne 'printf "http://www.youtube.com/watch?v=%s&hd=1\n", $& if /[^\(]+(?=\)$)/' file.txt

或多行版本:

perl -lne '
    printf(
        "http://www.youtube.com/watch?v=%s&hd=1\n",
        $&
    ) if /[^\(]+(?=\)$)/
' file.txt
于 2013-03-13T17:39:22.913 回答