2012-12-31 188 views
1

我想更换特定BBCodes像更换bbcodesSED与正则表达式

[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 

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

谢谢!要做到这一点

+1

你能后的预期在这种情况下输出? – Guru

回答

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] 
     } 
    } 
} 
1

方式一:

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

您的解决方案效果很好,但零是占位符。原始网址具有像2DfefdfFDfb这样的随机字符串 – spinsch

0

这可能会为你工作(GNU SED):

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