색상을 추가하고 싶은 미국 지도의 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>
grep
or를 사용할 수 있다고 생각했지만 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의 내부 업데이트가 수행됩니다.
id
bash: 를 사용하여 소문자로 변환됩니다${id,,}
. 해당 문자열g id="${id,,}"
을 찾아g id="${id,,} style="fill:$color;"
.참고:
$id
및$color
sed 명령으로 직접 대체됩니다. 너는 이것을 해야 해~하지 않는 한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