2010-02-25 60 views
2

我想解析一個css文件並將每個像素值乘以(2/3)。我想知道sed是否有可能?我知道這是不正確的語法,但我認爲它會帶回家的是我想達到的解釋:sed的計算

sed -e "s|\([0-9]*\)px|int((\1 * 2)/3)|g" file.css 

所以基本上我要帶\ 1,由(2/3)相乘,並轉換爲和int。或者用awk更可能呢?假設我可以編寫一個python腳本,但想知道是否可以通過更快的方式完成。

感謝

回答

6

用awk

$ cat file 
foo: 3px; bar: 6px 

$ awk '{for(i=1;i<=NF;i++){if($i~/^[0-9]+px/){o=$i;sub(/^[0-9]+/,"",o);$i=($i+0)*(2/3)o}}}1' file 
foo: 2px; bar: 4px 
+0

它對'foo:3px'不起作用,其*是*有效的CSS。但只要你不寫這樣的垃圾,你就沒事了:D @tomh'-vCONVFMT =%d'將確保數字被截斷爲整數。 – ephemient 2010-02-26 18:43:59

2

您可以使用Perl像這樣做:

echo -e "100px;\n20px;" | perl -pe 's{ (\d*) (?=px) }{ $1*(2/3) }xe' 
+0

如果一行中有多於一個的事件,則不起作用 – mug896 2017-01-23 06:39:52

0

要回答最初的問題:是的,你可以在SED做到這一點,不,你不想這樣做,除非你有一些奇怪的限制阻止你使用任何其他工具。

我這樣說是因爲unix dc命令(桌面計算器)是在sed中編寫的,但它可以通過執行數學來工作,就像您可能在學校教數學一樣:字符串在數字上的操作,這樣。

您實際上必須編寫乘法和除法命令(或將它們從dc.sed中除去)才能完成此任務,並且結果將比上述任何建議運行慢幾個數量級。

如果您現在對dc.sed感興趣,通常將其作爲任何sed分發中的示例之一提供。

+0

概述:http://sed.sourceforge.net/grabbag/scripts/dc_overview.htm腳本:http://sed.sourceforge.net/grabbag/scripts/dc.sed – 2010-02-25 22:32:47

0
sed $(sed -rn ' 
    :X 
    /([0-9]+)px/ { 
     s##\a\1\a# 
     h 
     s#.*\a(.*)\a.*#echo -e s/\1px/$((\1 * 2/3))px/g#ep 
     x 
     bX 
    } 
    ' cssfile) cssfile