Dependiendo de la condición previa, de que todos sus objetos están agrupados y no combinados en grupos más grandes, a continuación se explica cómo hacerlo. (Usé gatos en el ejemplo, porque los perros no estaban disponibles).
En la parte inferior derecha, verá un gato resaltado, id. De objeto 5358, que es una ruta única, por lo que agregué un piso verde más tarde que lo cambió al objeto 5364 que ocurrirá más tarde, así que no se confunda. :)
Obtiene el editor xml presionando el botón 4 desde la derecha (flecha 1).
Cambié g5358 a g-cat-5358 (campo 4) para facilitar que una herramienta de texto elija estos objetos que funcionan para la mayoría de los elementos que no colisionan con xml-svg-names (color, meta, id, ... )
En la ventana izquierda, verá que ya hay una entidad renombrada, g-cat-5312, cerca de la parte superior en el mismo nivel de sangría.
Inkscape organiza identificadores únicos para grupos, pero no es necesario que tengan la forma gNUMBER, puede mezclar otros caracteres. Simplemente no elija un identificador ya existente.
Después de cambiar el identificador, presione 'setzen (set)' (5) para confirmar su cambio. Ves una interfaz alemana aquí, YMMV.
Guarde el svg (como demo-cats.svg). Ahora pasamos a las secuencias de comandos.
for cat in $( grep g-cat- demo-cats.svg )
do
id=${cat//[^0-9]/}
echo $id
(head -n 53 demo-cats.svg; sed -n "/$cat/,/^ <\/g>/p" demo-cats.svg; echo "</svg>" ) > cat-${id}.svg
done
¿Qué hace? Hace greps (busca con grep) para el patrón "g-cat-" que es el comienzo de nuestra interesante sección.
id=${cat//[^0-9]/}
extrae el id en bash de la expresión. Echo lo imprime en la pantalla, lo que debería ayudar a encontrar el error si algo sale mal. head -n 53 demo-cats.svg toma las primeras 53 líneas del svg, que contiene todo el svg-boilerplate. Dependiendo de su configuración con diferentes formatos de svg (inkscape, comprimido, svg normal, inkscape-comprimido) esto puede variar. Con nl demo-cats.svg | less
puedes n umerate los l ines, para encontrar el punto de corte adecuado en su caso.
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
^ Hasta esta parte, se deben incluir las líneas.
El siguiente comando se realiza con el comando s tream ed it : sed -n "/$cat/,/^ <\/g>/p" demo-cats.svg;
dice (-n) no print (but) search para el grupo cat, hasta la etiqueta de cierre g en el nivel de sangría 2, que es 4 espacios antes de </g>
si no lo hizo cambiar las preferencias de Inkscape, que quizás recuerdes si lo hicieras. A continuación, añadir la etiqueta de cierre para SVG: echo "</svg>"
. Escriba la salida en el archivo 'cat- $ id.svg' (esto sobrescribe los archivos silenciosamente existentes).
Así que termino con dos archivos: cat-5312.svg y cat-5364.svg.
Una solución más elegante debería ser posible con xmlstarlet o herramientas similares, que están hechas para buscar y editar archivos xml. Desafortunadamente, no estoy acostumbrado y no pude hacerlo funcionar después de leer 10 minutos de documentación. No necesitaría cambiar el nombre de los grupos al principio.