色を追加したいアメリカ地図の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 を 2 回使用します。
</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
1行目はsedスクリプト(/tmp/script.sed)を生成し、2行目はこれを実装します。ステータスリストが/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