Dependendo da pré-condição, de que todos os seus objetos são agrupados e não combinados em grupos maiores, aqui está como fazê-lo. (Eu usei gatos no exemplo, porque os cães não estavam disponíveis).
No canto inferior direito, você vê um gato realçado, objeto id 5358, que é um caminho único; por isso, adicionei um piso verde mais tarde, que foi alterado para o objeto 5364, que ocorrerá mais tarde. Portanto, não deixe confundi-lo. :)
Você obtém o editor xml pressionando o botão 4 da direita (seta 1).
Alterei g5358 para g-cat-5358 (campo 4) para facilitar a ferramenta de texto escolher esses objetos que funcionam para a maioria dos elementos que não colidem com xml-svg-names (color, meta, id, ... )
Na janela esquerda, você vê que já existe uma entidade renomeada, g-cat-5312, próxima à parte superior no mesmo nível de indentação.
O Inkscape organiza IDs exclusivos para grupos, mas eles não precisam ter o formato gNUMBER, você pode misturar outros caracteres. Apenas não escolha um identificador já existente.
Depois de alterar o identificador, pressione 'setzen (set)' (5) para confirmar sua alteração. Você vê uma interface alemã aqui, YMMV.
Salve o svg (como demo-cats.svg). Agora, mudamos para scripts.
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
O que isso faz? Ele greps (procure com grep) pelo padrão "g-cat-", que é o começo de nossa seção interessante.
id=${cat//[^0-9]/}
extrai o ID no bash da expressão. O Echo imprime na tela, o que deve ajudar a encontrar o erro, se algo der errado. head -n 53 demo-cats.svg pega as primeiras 53 linhas do svg, que contém todo o svg-boilerplate. Dependendo das suas configurações com diferentes formatos svg (inkscape, compactado, svg normal, inkscape-compactado), isso pode variar. Com nl demo-cats.svg | less
você pode n umerate as l ines, para encontrar o ponto de corte para a direita no seu caso.
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
^ Até esta parte, as linhas devem ser incluídas.
O próximo comando é feito com o s tream ed itor sed: sed -n "/$cat/,/^ <\/g>/p" demo-cats.svg;
diz (-n) sem impressão (mas) searche para o grupo gato, até a marca de fechamento g no nível de recuo 2, que é de 4 espaços antes do </g>
se você não fez altere as preferências do Inkscape, das quais você poderá se lembrar se o fez. Em seguida, adicione a marca de fechamento para SVG: echo "</svg>"
. Escreva a saída no arquivo 'cat- $ id.svg' (isso substitui os arquivos existentes silenciosamente).
Então, acabo com dois arquivos: cat-5312.svg e cat-5364.svg.
Uma solução mais elegante deve ser possível com xmlstarlet ou ferramentas semelhantes, criadas para pesquisar e editar arquivos xml. Infelizmente, não estou acostumado a isso e não o funcionou depois de ler 10 minutos de documentação. Você não precisaria renomear os grupos no começo.