sed/awk/cut/grep-提取字符串的最佳方法

sed/awk/cut/grep-提取字符串的最佳方法,sed,awk,grep,cut,perl,Sed,Awk,Grep,Cut,Perl,我有一个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 Ther

我有一个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:

注意,我将&hd=1附加到我试图替换的字符串中。我曾尝试使用Linux reverse和cut,但reverse或rev会破坏我的数据。这里最困难的部分是文本文件中的每一行都有带括号的条目,我只关心最后一组括号之间的数据。每一行都有一个可变的长度,因此这也没有什么帮助。那末使用grep和.$怎么样

总之,我想从results.txt中提取youtube ID,并将其导出为以下格式的新文件:

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


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

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

使用
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
使用单衬套:

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
使用单衬套:

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