![sed/awk/grep/cut:将 xml 属性中的数字乘以十](https://linux22.com/image/144567/sed%2Fawk%2Fgrep%2Fcut%EF%BC%9A%E5%B0%86%20xml%20%E5%B1%9E%E6%80%A7%E4%B8%AD%E7%9A%84%E6%95%B0%E5%AD%97%E4%B9%98%E4%BB%A5%E5%8D%81.png)
我想将 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 错误)
我当前的脚本如下所示:
#!/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 中的值的循环。