sed/awk/grep/cut: xml 속성의 숫자에 10을 곱합니다.

sed/awk/grep/cut: xml 속성의 숫자에 10을 곱합니다.

svg 파일의 viewBox 속성에 10배를 곱하고 싶습니다.

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" version="1.1">다음으로 변경하고 싶습니다 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000" version="1.1"><g transform="scale(10)"> (해결하려면 필요함).librsvg 오류)

내 현재 스크립트는 다음과 같습니다.

#!/bin/bash

# defining file
export i=test.svg

#solved librsvg-Bug T194192 https://phabricator.wikimedia.org/T194192
sed -ri "s/<svg([-[:alnum:]=\"\.\/: ]*) viewBox=\"0,0,([[:digit:]\.]*),([[:digit:]\.]*)\"/<svg viewBox=\"0 0 \2 \3\"\1/g" $i


#put viewBox at the beginning (otherwise I will have a variable to less)
sed -ri 's/<svg([-[:alnum:]=\" \.\/:\,\(\)_#]+) viewBox="([-[:digit:] \.]+)"([-[:alnum:]=\" \.\/:\,\(\);#]*)>/<svg viewBox="\2"\1\3>/' $i
sed -ri 's/\r/\n/g' $i

#Define file as a variable
export h=$(sed -r 's/<svg viewBox="([-[:digit:]]+) ([-[:digit:]]+) ([[:digit:]]+)\.([[:digit:]])([[:digit:]]*) ([[:digit:]]+)\.([[:digit:]])([[:digit:]]*)"([-[:alnum:]=\" \.\/:\,\(\)_;]+)>/<svg viewBox="\1 \2 \3\4.\50 \6\7.\80"\9><g transform="scale(10)">/' $i)

#Reading out the relevant line
export j=$(ls -l|grep -E "viewBox=\"[-[:digit:].]{1,8} [-[:digit:].]{1,8} [[:digit:].]{2,11} [[:digit:].]{2,11}" $i)

#Insert a special character to define the point of splitting
export l=$(echo $j | sed -e "s/viewBox=\"/>/g" )

#split at this special character and take the part afterwards
export m=$(echo $l | cut -f2 -d">")

#Multiply the four numbers by a factor of 10
export n=$(echo $m | awk  '{printf "%f %f %f %f\n",$1*10,$2*10,$3*10,$4*10}')

#Replace the old four numbers with the new four numbers
sed -ri "s/<svg([-[:alnum:]=\" \.\/:;\,#]*) viewBox=\"[-[:digit:]\.]+ [-[:digit:]\.]+ [[:digit:]\.]+ [[:digit:]\.]+\"([-[:alnum:]=\" \.\/:\,#\(\)_;]+)>/<svg\1 viewBox=\"$n\"\2>\n<g transform=\"scale(10)\">/" $i

이것은 예쁘지도 않고 항상 작동하지도 않습니다. (예를 들어, 내장된 mother-svg 내부에 인라인 svg가 있으면 작동하지 않습니다())

원하는 것은 무엇이든 사용할 수 있습니다.

  • Ubuntu의 Cygwin에서도 작동합니다.
  • 배치 명령이어야 합니다.

답변1

Perl을 사용하여 정규식으로 수학을 수행할 수 있습니다.

perl -pe 's/viewBox="(\d+) (\d+) (\d+) (\d+)"/"viewBox=\"".($1*10)." ".($2*10)." ".($3*10)." ".($4*10)."\""/eg' <input file>

한 줄이 아닌 완전한 스크립트로 만들어서 조금 정리할 수 있습니다. 이 시점에서는 아마도 정규식에서 수학을 추출하고 이를 viewBox의 값에 대한 루프로 대체할 것입니다.

관련 정보