我目前正在进行的项目已经见过各种背景的各种程序员。在成功编写干净的Capistrano配方以最小化css和js文件之后,我问自己如何识别遍布我们的css代码库的各种url模式,在它们上线之前立即重写它们。 我正在寻找的模式是
url('../../images/
url(../images/
url("../../../images/
url(images/
所以基本上,这是一个输入示例:
.test{background:url('/images/test.jpg') no-repeat top left}.pouet{background:url("../../images/bg.png")}
请注意,在某些情况下,我们有引号,有些则不是...... 而我正在努力获取
.test{background:url('http://www.cdnImages.com/images/test.jpg') no-repeat top left}.pouet{background:url("http://www.cdnImages.com/images/bg.png")}
所有这些必须由我的cdn网址替换。最令人费解的是如何以不允许任何错误的方式这样做。
我想出了一个符合我需求的正则表达式:rubular permalink
我正在查看sed命令,使用如下
sed '/url([^\/](.*?)images/http:\/\/www.cdnImages.com' myFile.css
但这似乎没有完成这项工作。
我目前的研究引导我进入这个
find #{current_release}/public/static/css/ -name '*.css' | xargs sed -i 's@url\([^\/](.*?)images|static\/@#{images_cdn}@g'
并且,虽然正则表达式完全符合需要(检查here to see the catched output,但某处似乎出现了问题。
有什么想法吗?非常感谢。
答案 0 :(得分:3)
这是我的测试用例
printf ".test{background:url('/images/test.jpg') no-repeat top left}.pouet{background:url(\"../../images/bg.png\")}\n" \
| sed 's@url[(][^)][^)]*)@url(http://www.cdnImages.com)@g'
.test{background:url(http://www.cdnImages.com) no-repeat top left}.pouet{background:url(http://www.cdnImages.com)}
啊......还有一件事
printf ".test{background:url('/images/test.jpg') no-repeat top left}.pouet{background:url(\"../../images/bg.png\")}\n" \
| sed 's@url[(][^)][^)]*)@url('"'"'http://www.cdnImages.com'"'"')@g'
.test{background:url('http://www.cdnImages.com') no-repeat top left}.pouet{background:url('http://www.cdnImages.com')}
请注意,对于某些sed,您需要转移第一个'@'符号,如\@
。
我看到你的示例输出保留了那里的相应'...'
和"..."
引号字符。我希望将所有内容更改为'...'
。如果没有,这会使问题更加复杂。
正如你所说这是一个生产推动而且'......以一种不允许出现任何错误的方式这样做。',你需要测试一下这个问题。
提升您的sed使用率,了解搜索模式@url[(][^)][^)]*)@
发生的事情。
在最后一轮中提升你的shell使用率,关于我改变为'"'"'http://www.cdnImages.com'"'"'
的原因/原因。 ; - )
我现在没时间了。
我希望这会有所帮助。
答案 1 :(得分:2)
我不知道为什么人们会让它复杂化,这很简单。我一直这样做。
data=$(cat <<EOF
.test{background:url('/images/test.jpg') no-repeat top left}.pouet{background:url("../../images/bg.png")}
EOF
)
prefix="http://www.cdnImages.com/"
rule=$(cat <<EOF
s|/*\(\.\./\)*\(images/[^'"]*\)|$prefix\2|g
EOF
)
echo "$data" | sed "$rule"
请注意\'
和"$prefix"
的转义。
答案 2 :(得分:1)
我终于找到了符合需要的完美命令:
run "find #{current_release}/public/static/css/ -name '*.css' -print0 | xargs -0 sed -i -E 's@(\.\.\/)+(images|static|img)@#{images_cdn}@g'"
快速安全地工作!