CSV 파일의 정보를 기반으로 SVG 파일 수정

CSV 파일의 정보를 기반으로 SVG 파일 수정

색상을 추가하고 싶은 미국 지도의 SVG 파일이 있습니다. 시간이 많이 걸리기 때문에 bash 스크립트를 사용할 수 있다고 생각했습니다. 상태와 해당 상태에 속하는 색상이 포함된 다른 파일이 있습니다.

SVG 파일:

<g id="hi">
    <title>Hawaii</title>
    <path class="state hi" d="m 233.08751,519.30948 ... z" id="HI" />
</g>

CSV 파일

HI, blue

내가 원하는 것은:

<g id="hi" style="fill:blue;">
        <title>Hawaii</title>
        <path class="state hi" d="m 233.08751,519.30948 ... z" id="HI" />
    </g>

grepor를 사용할 수 있다고 생각했지만 sed어디서부터 시작해야 할지 모르겠습니다.

답변1

bash 및 GNU sed 사용:

while IFS=",$IFS" read id color
do
    sed -i "s/g id=\"${id,,}\"/& style=\"fill:$color;\"/g" file.svg
done <file.csv

완료되면 file.svg는 다음과 같습니다.

<g id="hi" style="fill:blue;">
    <title>Hawaii</title>
    <path class="state hi" d="m 233.08751,519.30948 ... z" id="HI" />
</g>

어떻게 작동하나요?

  • while IFS=",$IFS" read id color; do

    while변수 sum 을 읽어 id루프를 시작 합니다 color. IFS입력이 쉼표와 공백으로 구분되도록 쉼표를 추가합니다 .

  • sed -i "s/g id=\"${id,,}\"/& style=\"fill:$color;\"/g" file.svg

    그러면 file.svg의 내부 업데이트가 수행됩니다. idbash: 를 사용하여 소문자로 변환됩니다 ${id,,}. 해당 문자열 g id="${id,,}"을 찾아 g id="${id,,} style="fill:$color;".

    참고: $id$colorsed 명령으로 직접 대체됩니다. 너는 이것을 해야 해~하지 않는 한file.csv 파일의 소스를 신뢰합니다.

  • done <file.csv

    그러면 while루프가 종료되고 루프에서 읽도록 지시합니다 file.csv.

BSD(OSX)

BSD 시스템을 사용하는 경우 sed 명령을 약간 수정해야 합니다.

while IFS=",$IFS" read id color
do
    sed -i "" "s/g id=\"${id,,}\"/& style=\"fill:$color;\"/g" file.svg
done <file.csv

답변2

Perl과 그 도구 사용하기xsh :

perl {
    open my $FH, '<', 'states.csv' or die $!;
    $h->{lc $1} = "$2;" while <$FH> =~ /(.*),\s*(.*)/;
};

open map.xml ;
for //g set @style concat("fill:", xsh:lookup('h', @id));
save :b ;

답변3

sed를 두 번 사용하십시오.

</tmp/states.csv tr "[A-Z]" "[a-z]" | \
sed -n 's/^\([a-z]\{2\}\), \([^ ]*\)$/s@<g id="\1">@<g id="\1" style="fill:\2;">@/p' >/tmp/script.sed
sed -f /tmp/script.sed /tmp/source.svg

첫 번째 줄은 sed 스크립트(/tmp/script.sed)를 생성하고 두 번째 줄은 이를 구현합니다. 상태 목록이 /tmp/states.csv에 저장되고 svg 파일이 /tmp/source.svg에 저장되어 있다고 가정합니다.

답변4

tr   \[:upper:] \[:lower:] <csv.file | sort -bt, -uk1,1   |
sed  -e'\|^ *\([[:alpha:]]\{2\}\) *, *\([[:alpha:]]\{1,\}\) *$|!d' \
     -e's||s/\\(<g id="\1"\\)>/\\1 style="fill:\2;">/;t|' |
sed  -f- svg.file

관련 정보