XmlStarlet - aplicação com interface de linha de comando para manipulação de XML.
Testes preliminares
SVG de teste:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="300" height="300">
<rect
id="rect"
style="fill:#080;stroke:#000;stroke-width:2"
width="200" height="150" x="30" y="30" ry="20" />
<circle
id="bola"
style="fill:#A00;stroke:#000;stroke-width:2"
cx="180" cy="180" r="100" />
</svg>
Coletando um atributo
style e substituindo o valor:
# Coletando o conteúdo do atributo estilo:
s=$( xmlstarlet sel -t -v "//::*[@id='bola']/@style" desenho.svg )
# isso: //::*[@id='bola']/@style
# é simplicação disso: descendant::*[attribute::id='bola']/attribute::style
# Modificando o valor de preenchimento:
s=$( echo "$s" | sed --regexp-extended 's/(^|;)fill:[^;]*(;|$)/\1fill:#08B\2/' )
# Inserindo valor modificado:
xmlstarlet ed -u "//*[@id='bola']/@style" -v "$s" desenho.svg > desenho2.svg