sed计算

时间:2010-02-25 16:42:58

标签: regex sed

我想解析一个css文件并将每个像素值乘以(2/3)。我想知道这是否可能与sed?我知道这是不正确的语法,但我认为它会带来我想要实现的解释:

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

所以基本上我想取\ 1,乘以(2/3)并转换为和int。或者也许awk更有可能?假设我可以编写一个python脚本,但想知道它是否可以通过更快的方式完成。

由于

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

你可以使用perl这样做:

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

答案 2 :(得分:0)

回答最初的问题:是的,你可以在sed中做到这一点,不,你不想这样做,除非你有一些奇怪的约束阻止你使用任何其他工具。

我之所以这么说是因为unix dc命令(桌面计算器)是用sed编写的,但是它的工作方式是IIRC,就像你在学校里教数学一样:对数字进行字符串操作,以及进位等等

你实际上必须编写乘法和除法命令(或将它们从dc.sed中删除)才能完成此操作,结果将比上述任何建议慢几个数量级。

如果您现在对dc.sed感到好奇,它通常作为任何sed发行版中的一个示例提供。

答案 3 :(得分: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