2010-02-25 11 views
2

Je veux analyser un fichier css et multiplier chaque valeur de pixel par (2/3). Je me demandais si c'était possible avec sed? Je sais que cela est une syntaxe incorrecte, mais je pense que ça va ramener à la maison l'explication de ce que je veux atteindre:sed calculs

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

Donc, fondamentalement, je veux prendre \ 1, multiplier par (2/3) et coulé à et int. Ou peut-être que c'est plus possible avec awk? Supposons que je puisse écrire un script python, mais j'aimerais savoir si cela peut être fait par des moyens plus rapides.

Merci

Répondre

6

utilisation 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

Il ne fonctionne pas sur 'foo: 3px', qui * est * CSS valide. Mais tant que vous n'écrivez pas comme ça, tout va bien: D @tomh '-vCONVFMT =% d' s'assurera que les nombres sont tronqués en entiers. – ephemient

2

Vous pouvez utiliser perl faire comme ceci:

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

cela ne fonctionne pas si plus d'une occurrence sur une ligne – mug896

0

Pour répondre à la question initiale: Oui, vous pouvez le faire dans sed, et Non, vous ne voulez PAS le faire, sauf si vous avez un ensemble de contraintes bizarres qui vous empêchent d'utiliser un autre outil. Je dis cela parce que la commande unix dc (une calculatrice de bureau) a été écrite dans sed, mais elle fonctionne IIRC en effectuant des mathématiques de la même façon qu'on vous enseignait probablement les mathématiques à l'école: manipulations de chaînes sur les chiffres, avec tel. Vous auriez en fait à écrire des commandes de multiplication et de division (ou les retirer de dc.sed) pour pouvoir accomplir cela et les résultats seraient plus faibles de quelques ordres de grandeur que n'importe laquelle des suggestions ci-dessus.

Dans le cas où vous êtes maintenant curieux au sujet de dc.sed, il est généralement fourni comme l'un des exemples dans n'importe quelle distribution sed.

+0

Vue d'ensemble: http://sed.sourceforge.net/grabbag/scripts/dc_overview.htm Script: http://sed.sourceforge.net/grabbag/scripts/dc.sed –

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