1

のような特定の BBCodes を置き換えたい

[youtube]http://youtube.com/watch?v=00000000000[\youtube]
[youtube]http://youtu.be/00000000000[\youtube]
[youtube]http://youtu.be/00000000000/[\youtube]
[youtube]http://youtube.com/watch?v=00000000000&something=wrong[\youtube]
[youtube]youtube.com/watch?v=00000000000[\youtube]

[MEDIA=youtube]00000000000[\MEDIA]

私の現在のパターンは一致しません:

 sed -i 's/\[youtube\]\(http:\/\/|https:\/\/|.*\)\(www\.|.*\)youtu\(be\.com|\.be\)\(\/watch\?v=|\/\)\([a-zA-Z0-9-]{11}\)\(.*\)\[\/youtube\]/\[MEDIA=youtube\]\5\[\/MEDIA\]/g' text.txt

あなたはそれについてどう思いますか?私のせいはどこですか?

ありがとう!

4

3 に答える 3

1

これを行う1つの方法:

sed -n '/^\[youtube\]/{s/[^0-9]*\([0-9]*\)*.*/[MEDIA=youtube]\1[\\MEDIA]/p}' input
于 2012-12-31T05:53:43.450 に答える
1

awk を使用した可能な解決策 (file.awk に入れ、file.txt を入力)。

awk -f ファイル.awk ファイル.txt

ファイル.awk

BEGIN {
    # a list of patterns
    lp = \
    "http://youtube.com/watch?v= http://youtube.com/watch?v=/ " \
    "http://youtu.be/ http://youtube.com/watch?v=/ " \
    "youtube.com/watch?v="

    # escape ?
    gsub("?", "\\?", lp)

    # add [youtube]
    media="youtube"
    gsub("[ ^]", " \\[" media "]", lp)

    # make array of patterns
    split(lp, pat, " ")
}

{
    for (i in pat) {
       n=split($0, arr, pat[i])
       if (n>1) {
           # remove rest of the string
           gsub("[/[&].*", "", arr[2])
           printf "[MEDIA=%s]%s[MEDIA]\n", media, arr[2]
       }
    }
}
于 2012-12-31T14:31:31.763 に答える
0

これはうまくいくかもしれません(GNU sed):

sed -ri '\|^\[([^]]+)\](http://)?[^/]*/(watch\?v=)?(.{11}).*\[\\\1\]$|s//[MEDIA=\1]\4[\\MEDIA]/' file
于 2013-01-01T21:57:35.953 に答える