首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sed用regex替换bbcode

sed用regex替换bbcode
EN

Stack Overflow用户
提问于 2012-12-31 13:42:20
回答 3查看 230关注 0票数 1

我想替换特定的BBCodes,比如

代码语言:javascript
复制
[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]

代码语言:javascript
复制
[MEDIA=youtube]00000000000[\MEDIA]

我当前的模式没有匹配:

代码语言:javascript
复制
 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

你觉得那个怎么样?哪里是我的错呢?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-31 22:31:32

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

awk -f file.awk file.txt

file.awk

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-12-31 13:53:43

一种方法是:

代码语言:javascript
复制
sed -n '/^\[youtube\]/{s/[^0-9]*\([0-9]*\)*.*/[MEDIA=youtube]\1[\\MEDIA]/p}' input
票数 1
EN

Stack Overflow用户

发布于 2013-01-02 05:57:36

这可能适用于您(GNU sed):

代码语言:javascript
复制
sed -ri '\|^\[([^]]+)\](http://)?[^/]*/(watch\?v=)?(.{11}).*\[\\\1\]$|s//[MEDIA=\1]\4[\\MEDIA]/' file
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14097904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档