在生产发布之前,在css文件中重写网址的最佳方法是什么?

时间:2011-07-31 19:01:51

标签: css regex bash capistrano web-deployment

我目前正在进行的项目已经见过各种背景的各种程序员。在成功编写干净的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,但某处似乎出现了问题。

有什么想法吗?非常感谢。

3 个答案:

答案 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'"

快速安全地工作!