我想替换特定的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你觉得那个怎么样?哪里是我的错呢?
谢谢!
发布于 2012-12-31 22:31:32
一个可能的解决方案是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]
}
}
}发布于 2012-12-31 13:53:43
一种方法是:
sed -n '/^\[youtube\]/{s/[^0-9]*\([0-9]*\)*.*/[MEDIA=youtube]\1[\\MEDIA]/p}' input发布于 2013-01-02 05:57:36
这可能适用于您(GNU sed):
sed -ri '\|^\[([^]]+)\](http://)?[^/]*/(watch\?v=)?(.{11}).*\[\\\1\]$|s//[MEDIA=\1]\4[\\MEDIA]/' filehttps://stackoverflow.com/questions/14097904
复制相似问题