我有 3 个 svg 文件,我想将它们合并为一个 svg 文件。每个文件中都有一个路径标签,我想将每个 svg 文件中的路径标签放入一个文件中。我想可能有一种方法可以用脚本来做到这一点。至少我希望有,我有几百个3个文件组。
答案1
这是我想出的,不确定这是否是执行此操作的最佳方法,但它似乎适用于我所做的少数测试。只需修改它即可在目录中的所有文件上运行。
$file_1 = '1a.svg'
$file_1_con = Get-Content -raw -Path $file_1
$file_2 = '1b.svg'
$file_2_con = Get-Content -raw -Path $file_2
$file_3 = '1c.svg'
$file_3_con = Get-Content -raw -Path $file_3
$result = '.\1d.svg'
$xml_con = ''
$doc_con = ''
$svg_con = ''
$path_block_con = ''
$path_lines_con = ''
$path_pegs_con = ''
$end_con = '</svg>'
$group_start = '<g>'
$group_end = '</g>'
if ($file_1_con -match '<\?xml(?=\s|>)[^>]*>') { $xml_con = $Matches.Values }
if ($file_1_con -match '<\!DOCTYPE(?=\s|>)[^>]*>') { $doc_con = $Matches.Values }
if ($file_1_con -match '<svg(?=\s|>)[^>]*>') { $svg_con = $Matches.Values }
if ($file_1_con -match '<path(?=\s|>)[^>]*>') { $path_block_con = $Matches.Values.replace('black','red').replace('lightgray','none') }
if ($file_2_con -match '<path(?=\s|>)[^>]*>') { $path_lines_con = $Matches.Values.replace('black','blue').replace('lightgray','none') }
if ($file_3_con -match '<path(?=\s|>)[^>]*>') { $path_pegs_con = $Matches.Values.replace('black','green').replace('lightgray','none') }
$xml_con+$doc_con+$svg_con+$group_start+$path_block_con+$path_lines_con+$path_pegs_con+$group_end+$end_con | Out-File -FilePath $result
答案2
我用 inkscape 制作的 3 个文件对此进行了测试。根据您的来源,您的 xml-code-layout 可能会有所不同,这将是一个很好的情况,使用 xmlstarlet 或类似的东西,但我不熟悉这些工具。
但是,如果您有数百个此类文件,则它们很可能是由工具以重复、稳定的方式生成的,因此非常适合 sed 这样的工具。
假设一些文件{a,b,c}.svg
:
从文件 2 和 3 中剪切出路径并将它们存储在 p23.svg 中:
sed -n '/<path/,/\/>/p' b.svg c.svg > p23.svg
遇到以下情况时请读入此文件close group tag
:
sed -r '/^ *<\/g>$/r p23.svg' a.svg | sed 's|</g>||; s|</svg>|</g></svg>|' > abc.svg
关闭组标签位于错误的位置,这就是为什么输出再次通过 sed 进行管道传输,最后写入 abc.svg 的原因。
路径应具有唯一的路径 ID。如果您总是有 3 个文件进行操作,那么识别冲突并重新编号 ID 应该很容易,或者只需重新编号而无需进行先前的碰撞检查。这留给读者作为练习。 :)