我想替换像
这样的特定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
你怎么看?哪里可能是我的错?
谢谢!
答案 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