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 と cut を使用してみましたが、reverse または rev によってデータが変更されます。ここで難しいのは、テキスト ファイルの各行に括弧付きのエントリがあり、最後の括弧の間のデータを取得することだけを考えていることです。各行の長さは可変であるため、これも役に立ちません。行末に 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 に答える