Awk
sed/awk/grep/cut:將 xml 屬性中的數字乘以 10
我想將 svg 文件的 viewBox 中的屬性乘以十倍。
我想更改
<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-bug)我目前的腳本如下所示:
#!/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 上工作
- 應該是一個批處理命令
您可以使用 perl 在您的正則表達式中進行數學運算:
perl -pe 's/viewBox="(\d+) (\d+) (\d+) (\d+)"/"viewBox=\"".($1*10)." ".($2*10)." ".($3*10)." ".($4*10)."\""/eg' <input file>
它可以通過使其成為一個完整的腳本而不是單行來稍微清理一下。在這一點上,我可能會在正則表達式中提取數學並將其替換為 viewBox 中值的循環。