根据前提条件,您的所有对象都被分组而不是组合成更大的组,这里是如何做到的。(我在示例中使用了猫,因为没有狗)。
在右下方,您会看到一只突出显示的猫,对象 id 5358,它是一条路径,所以我稍后添加了一个绿色地板,将其更改为稍后会出现的对象 5364,所以不要让您感到困惑。:)
您可以通过点击右侧的按钮 4(箭头 1)来获得 xml 编辑器。
我将 g5358 更改为 g-cat-5358(字段 4),以使 texttool 可以轻松选择这些对象,这些对象适用于大多数不与 xml-svg-names 冲突的元素(颜色、元、id、... )。
在左侧窗口中,您看到已经有一个重命名的实体,g-cat-5312 在同一缩进级别靠近顶部。
Inkscape 为组组织了唯一的 id,但它们不需要是 gNUMBER 的形式,你可以混入其他字符。只是不要选择已经存在的标识符。
更改标识符后,点击“setzen (set)”(5) 以确认您的更改。你在这里看到一个德语界面,YMMV。
保存 svg(作为 demo-cats.svg)。我们现在切换到脚本。
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
它有什么作用?它用 greps(用 grep 搜索)寻找“g-cat-”模式,这是我们有趣部分的开始。
id=${cat//[^0-9]/}
从表达式中提取 bash 中的 id。Echo 将其打印到屏幕上,如果出现问题,这将有助于找到错误。head -n 53 demo-cats.svg 从包含所有 svg-boilerplate 的 svg 中获取前 53 行。根据您使用不同 svg 格式(inkscape、压缩、普通 svg、inkscape 压缩)的设置,这可能会有所不同。nl demo-cats.svg | less
您可以计算线条,找到适合您情况的正确切割点。
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
^到这部分为止,应该包括行。
下一个命令是用s处理的sed完成的:说 ( -nsed -n "/$cat/,/^ <\/g>/p" demo-cats.svg;
) 不打印 (但是) 搜索 cat 组,直到缩进级别 2 处的结束标记 g,如果你没有,则在</g>
if you didn't之前 4 个空格更改 Inkscape 首选项,如果您这样做了,您可能会记得。然后添加 svg: 的结束标签echo "</svg>"
。将输出写入文件 'cat-$id.svg' (这会以静默方式覆盖现有文件)。
所以我最终得到了两个文件: cat-5312.svg 和 cat-5364.svg 。
使用用于搜索和编辑 xml 文件的 xmlstarlet 或类似工具应该可以提供更优雅的解决方案。不幸的是,我不习惯它,并且在阅读了 10 分钟的文档后并没有让它工作。您不需要在开始时重命名组。