#1 Le 04/10/2016, à 13:47
- jovial
Modifier proprement un svg(xml) en bash
Bonjour
J'ai par exemple un fichier rect_bleu.svg dont je veux changer une couleur et l'enregister >rect_rose.svg
Je veux modifier la couleur de "stop-color:#0068ff" par #ff00b0 dans le fichier ci- dessous. Je connais pas forcement la couleur d'origine donc c'est la proprété que je souhaite changer.
Comment le faire proprement avec une fonction dédiée xml en bashscript ?
Jluc
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
<defs
id="defs4">
<linearGradient
osb:paint="solid"
id="linearGradient4156">
<stop
id="stop4158"
offset="0"
style="stop-color:#0068ff;stop-opacity:1;" /> <!-- - - - - - - - COULEUR A MODIFIER - - - - - - - - -->
<linearGradient
gradientTransform="translate(0,-3.9998797)"
gradientUnits="userSpaceOnUse"
y2="1042.3622"
x2="49.999992"
y1="1042.3622"
x1="0"
id="linearGradient4160"
xlink:href="#linearGradient4156" />
<linearGradient
gradientTransform="translate(0,-25.999877)"
y2="1042.3622"
x2="49.999992"
y1="1042.3622"
x1="0"
gradientUnits="userSpaceOnUse"
id="linearGradient4164"
xlink:href="#linearGradient4156" />
</defs>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-1002.3622)"
id="layer1">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4160);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4154"
width="49.999985"
height="19.999996"
x="0"
y="1028.3622" />
<rect
y="1006.3622"
x="0"
height="19.999996"
width="49.999985"
id="rect4162"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4164);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
</g>
</svg>
Dernière modification par jovial (Le 04/10/2016, à 13:55)
Ubuntu 22.10: Dell Optiplex 7040, I7-6700 16Gio - 22.04: Dell Latitude E7270 i5-6300U 8Gio
Hors ligne
#2 Le 04/10/2016, à 16:17
- pingouinux
Re : Modifier proprement un svg(xml) en bash
Bonjour,
Ce n'est pas une fonction dédiée xml, mais tu peux essayer ceci :
sed -r 's/(stop-color:#)[0-9a-f]{6};/\1ff00b0;/g' rect_bleu.svg >rect_rose.svg
Ajouté :
Autre façon de faire
couleur=#ff00b0; nom_couleur=rose
sed -r "s/(stop-color:)#[0-9a-f]{6};/\1$couleur;/g" rect_bleu.svg >rect_$nom_couleur.svg
Dernière modification par pingouinux (Le 05/10/2016, à 06:43)
Hors ligne
#3 Le 04/10/2016, à 22:21
- claudius01
Re : Modifier proprement un svg(xml) en bash
Bonsoir,
Peut-être que Module xpath from libxml2 pourrait t'aider car appelable directement d'un script bash comme indiqué (en autre) dans Linux Bash XMLLINT with XPATH...
Hors ligne
#4 Le 07/10/2016, à 12:52
- jovial
Re : Modifier proprement un svg(xml) en bash
sed -r 's/(stop-color:#)[0-9a-f]{6};/\1ff00b0;/g' rect_bleu.svg >rect_rose.svg
Fait le job dans l'exemple que j'ai donné maintenant si j'ajoute un autre objet avec un autre stop-color cela me le change aussi voir fichier fourni ci-dessous.
Dans inkscape 0.91 j'utilise pour le remplissage du fond "Echantillon(swach en anglais)" voir dialog qui s'ajoute dans une palette interne au svg de style couleur. si je bouge ma couleur d'échantillon cela modifie la couleur de tous les objets qui l'utilisent
Dans mon svg ma couleur est définie dans une balise id= stop4156 avec l'élément et sa valeur stop-color:#0068ff
Dans inkscape c'est structuré comme un degradé avec une seule couleur(stop-color) qui est défini avec le code suivant:
<stop id="stop4158" offset="0" style="stop-color:#0068ff;stop-opacity:1;" />
Pour xpath et xbxml2 je suis connais pas assez bash pour l'exploité, j'ai trouvés que des exemple qui récupérent une valeur mais pas qui la mofifie.
Donc si j'avais un ex d'un fonction xml qui permet de faire cela que je puise appeler à partir de bash ce serai top.
Sinon c'est de créer un script de ce style
#!/bin/bash
echo "start set_svg_val.sh()......................."
svg=$1
id=$2
element=$3
val=$4
echo "file=" $svg " id=" $id " element=" $element " color=" $val
# Code pour modifier le svg ....
# pour mon ex appel du script: ./set_svg_val1.sh "file1.svg" "stop4158" "stop-color" "#ff00b0" > file2.svg
Pour xpath et xbxml2 je suis connais pas assez le bash pour l'exploité, j'ai trouvés que des exemple qui récupérent une valeur mais pas qui la mofifie.
Donc le but final c'est modifier la couleur d'un objet dans une centaine fichier svg, je peux le faire bêtement en remplacant :#0068ff" par #ff00b0 mais je souhaiterai apprendre à utiliser le potentiel du xml pour modifier par exemple la taille d'un objet...
Merci à ceux qui ont répondus
Le svg à modifier la couleur 0068ff se trouve à la lign 29
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="50"
height="50"
viewBox="0 0 49.999997 49.999997"
id="svg2"
version="1.1">
<defs
id="defs4">
<linearGradient
osb:paint="solid"
id="linearGradient4146">
<stop
id="stop4148"
offset="0"
style="stop-color:#6bd500;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient4156"
osb:paint="solid">
<stop
style="stop-color:#0068ff;stop-opacity:1;"
offset="0"
id="stop4158" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient4156"
id="linearGradient4160"
x1="0"
y1="1042.3622"
x2="49.999992"
y2="1042.3622"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.67088602,0,0,0.90521995,7.769255,-907.6785)" />
<linearGradient
xlink:href="#linearGradient4156"
id="linearGradient4164"
gradientUnits="userSpaceOnUse"
x1="0"
y1="1042.3622"
x2="49.999992"
y2="1042.3622"
gradientTransform="matrix(0.67088602,0,0,0.89137867,7.8389824,-914.53064)" />
</defs>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<rect
y="0.36439335"
x="-0.21186441"
height="49.661007"
width="25.847445"
id="rect4142"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ebe9e7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4160);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4154"
width="33.544289"
height="18.104395"
x="7.7692547"
y="26.836262" />
<rect
y="5.6948972"
x="7.8389816"
height="17.82757"
width="33.544289"
id="rect4162"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4164);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
</svg>
Dernière modification par jovial (Le 07/10/2016, à 14:22)
Ubuntu 22.10: Dell Optiplex 7040, I7-6700 16Gio - 22.04: Dell Latitude E7270 i5-6300U 8Gio
Hors ligne