여러 svg 파일의 내용 병합

여러 svg 파일의 내용 병합

3개의 svg 파일이 있는데 이를 하나의 svg 파일로 병합하고 싶습니다. 각 파일에는 경로 태그가 있으며 각 svg 파일의 경로 태그를 파일에 넣고 싶습니다. 스크립트로 이를 수행할 수 있는 방법이 있을 것이라고 생각했습니다. 적어도 그러기를 바랍니다. 수백 개의 파일 그룹이 있습니다.

답변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 코드 레이아웃이 다를 수 있으므로 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 번호를 다시 매기거나 이전 충돌 검사를 수행하지 않고 번호를 다시 매기는 것이 쉽습니다. 이것은 독자들에게 연습문제로 남겨둔다. :)

관련 정보