1

我想替换特定的 BBCode,例如

[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

一种方法:

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 回答