2011-07-31 10 views
4

我目前正在從事的項目已經看到了來自不同背景的各種編碼器。爲了最大限度地減少css和js文件,我成功地編寫了一個乾淨的Capistrano配方,我問自己如何識別在我們的css代碼庫中傳播的各種url模式,並在它們上線之前一次性重寫它們。 我正在尋找的模式是在生產啓動前重寫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 '[email protected]\([^\/](.*?)images|static\/@#{images_cdn}@g' 

和,而正則表達式完全符合需要(檢查here to see the catched output,似乎有什麼不對勁的地方。

任何想法?非常感謝。

+0

更好地發佈之前和之後的例子和你迄今爲止嘗試;-)。祝你好運。 – shellter

+0

並不多,我一直在使用sed,如下所示:find -type f -name'* .css'| sed -I文件-i「'」s | url(\([^)] * \)| url(#{cdn_url} \ 1 | g「文件 – pixelboy

+0

mmmm ...也試過sed'/ url \([^ \ /(。*?)images/cdnUrl.com'myFile.css ... unsuccessfuly – pixelboy

回答

1

我終於想出了一個完美的命令,適合需要:

run "find #{current_release}/public/static/css/ -name '*.css' -print0 | xargs -0 sed -i -E '[email protected](\.\.\/)+(images|static|img)@#{images_cdn}@g'" 

工作快速,安全!

3

這裏是我的測試案例

printf ".test{background:url('/images/test.jpg') no-repeat top left}.pouet{background:url(\"../../images/bg.png\")}\n" \ 
| sed '[email protected][(][^)][^)]*)@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 '[email protected][(][^)][^)]*)@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'"'"',在最後一輪。 ;-)

我離開的時間,現在。

我希望這會有所幫助。

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"的轉義的。

+0

因爲我是一個班輪,我想我不會選擇你的答案作爲接受的答案。但它也有訣竅。謝謝。 – pixelboy

+0

heredoc的是因爲它比逃避一切更漂亮。一個班輪將是'echo「$ data」| sed's |/* \(\。\ ./ \)* \(images/[^'\''「] * \)| http://www.cdnImages.com/ \ 2 | g''。不那麼漂亮。 – norcalli

相關問題