sed用正则表达式替换bbcodes

时间:2012-12-31 05:42:20

标签: regex linux sed bbcode

我想替换像

这样的特定BBC代码
[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

你怎么看?哪里可能是我的错?

谢谢!

3 个答案:

答案 0 :(得分:1)

一种方法:

sed -n '/^\[youtube\]/{s/[^0-9]*\([0-9]*\)*.*/[MEDIA=youtube]\1[\\MEDIA]/p}' input

答案 1 :(得分:1)

使用awk的一个可能的解决方案(把它放在file.awk和file.txt是你的输入)。

awk -f file.awk file.txt

<强> file.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]
       }
    }
}

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -ri '\|^\[([^]]+)\](http://)?[^/]*/(watch\?v=)?(.{11}).*\[\\\1\]$|s//[MEDIA=\1]\4[\\MEDIA]/' file