Svg 在文本编辑器中修剪数字的小数位数

Svg 在文本编辑器中修剪数字的小数位数,svg,grep,precision,inkscape,Svg,Grep,Precision,Inkscape,我有一组从Inkspace导出的SVG定义,任何一个这样做过的人都会知道,生成的定义通常包含更高的精度,这实际上是合理的。例如,对于下面显示的32 x32图标定义,Inkspace已生成每像素精度的6位(或更多!)小数位。现在我知道这意味着它可以扩展,但就我而言,我宁愿在我的应用程序中节省空间,因为它需要输入数百个这样的图标定义 <svg width="32" height="32"><path d="M 14.576172 5.453125 L 13.78125 8.8222

我有一组从Inkspace导出的SVG定义,任何一个这样做过的人都会知道,生成的定义通常包含更高的精度,这实际上是合理的。例如,对于下面显示的32 x32图标定义,Inkspace已生成每像素精度的6位(或更多!)小数位。现在我知道这意味着它可以扩展,但就我而言,我宁愿在我的应用程序中节省空间,因为它需要输入数百个这样的图标定义

<svg width="32" height="32"><path d="M 14.576172 5.453125 L 13.78125 8.8222656 L 12.464844 9.3691406 L 9.5625 7.5898438 L 7.5898438 9.5351562 L 9.3691406 12.576172 L 8.8222656 13.78125 L 5.4785156 14.630859 L 5.4785156 17.369141 L 8.8496094 18.246094 L 9.3691406 19.507812 L 7.5625 22.464844 L 9.5351562 24.410156 L 12.548828 22.658203 L 13.808594 23.177734 L 14.603516 26.494141 L 17.396484 26.521484 L 18.191406 23.177734 L 19.505859 22.658203 L 22.410156 24.410156 L 24.355469 22.410156 L 22.658203 19.451172 L 23.150391 18.191406 L 26.492188 17.369141 L 26.492188 14.630859 L 23.123047 13.726562 L 22.630859 12.521484 L 24.410156 9.5351562 L 22.410156 7.5898438 L 19.451172 9.3417969 L 18.246094 8.8222656 L 17.396484 5.453125 L 14.576172 5.453125 z M 15.984375 12.082031 A 3.9078221 3.9078221 0 0 1 19.892578 15.988281 A 3.9078221 3.9078221 0 0 1 15.984375 19.896484 A 3.9078221 3.9078221 0 0 1 12.078125 15.988281 A 3.9078221 3.9078221 0 0 1 15.984375 12.082031 Z" fill="#f9f9f9" /></svg>
我可以搜索所有6位小数的字符串,并用2位小数替换它们。然后我可以将搜索和替换更改为

(\.[0-9][0-9])([0-9][0-9][0-9][0-9][0-9])
\1
然后去

(\.[0-9][0-9])([0-9][0-9][0-9][0-9])
\1
最后是

(\.[0-9][0-9])([0-9][0-9][0-9])
\1
这是有效的


但是,如果有人的大脑像素比我多一点(或更多),可以告诉我如何通过一次搜索和替换操作来完成上述所有操作,我将非常高兴。

要从(bash或shell)命令行中删除不需要的精度,请尝试:

sed -E 's/([[:digit:]]\.[[:digit:]]{2})[[:digit:]]+/\1/g' file.svg
要就地更改文件(Linux)

或OSX:

sed -i .bak -E 's/([[:digit:]]\.[[:digit:]]{2})[[:digit:]]+/\1/g' file.svg
工作原理 这将查找有一个数字,后跟一个句点,后跟两个数字,后跟多个数字的任何位置:

([[:digit:]]\.[[:digit:]]{2})[[:digit:]]+
第一个数字、句号和后面的两个数字都在括号中。这将它们保存到组1中,我们将其用作替换文本

例子 您的输入文件:

$ cat >file.svg
<svg width="32" height="32"><path d="M 14.576172 5.453125 L 13.78125 8.8222656 L 12.464844 9.3691406 L 9.5625 7.5898438 L 7.5898438 9.5351562 L 9.3691406 12.576172 L 8.8222656 13.78125 L 5.4785156 14.630859 L 5.4785156 17.369141 L 8.8496094 18.246094 L 9.3691406 19.507812 L 7.5625 22.464844 L 9.5351562 24.410156 L 12.548828 22.658203 L 13.808594 23.177734 L 14.603516 26.494141 L 17.396484 26.521484 L 18.191406 23.177734 L 19.505859 22.658203 L 22.410156 24.410156 L 24.355469 22.410156 L 22.658203 19.451172 L 23.150391 18.191406 L 26.492188 17.369141 L 26.492188 14.630859 L 23.123047 13.726562 L 22.630859 12.521484 L 24.410156 9.5351562 L 22.410156 7.5898438 L 19.451172 9.3417969 L 18.246094 8.8222656 L 17.396484 5.453125 L 14.576172 5.453125 z M 15.984375 12.082031 A 3.9078221 3.9078221 0 0 1 19.892578 15.988281 A 3.9078221 3.9078221 0 0 1 15.984375 19.896484 A 3.9078221 3.9078221 0 0 1 12.078125 15.988281 A 3.9078221 3.9078221 0 0 1 15.984375 12.082031 Z" fill="#f9f9f9" /></svg>
$cat>file.svg
我们的司令部:

$ sed -E 's/([[:digit:]]\.[[:digit:]]{2})[[:digit:]]+/\1/g' file.svg 
<svg width="32" height="32"><path d="M 14.57 5.45 L 13.78 8.82 L 12.46 9.36 L 9.56 7.58 L 7.58 9.53 L 9.36 12.57 L 8.82 13.78 L 5.47 14.63 L 5.47 17.36 L 8.84 18.24 L 9.36 19.50 L 7.56 22.46 L 9.53 24.41 L 12.54 22.65 L 13.80 23.17 L 14.60 26.49 L 17.39 26.52 L 18.19 23.17 L 19.50 22.65 L 22.41 24.41 L 24.35 22.41 L 22.65 19.45 L 23.15 18.19 L 26.49 17.36 L 26.49 14.63 L 23.12 13.72 L 22.63 12.52 L 24.41 9.53 L 22.41 7.58 L 19.45 9.34 L 18.24 8.82 L 17.39 5.45 L 14.57 5.45 z M 15.98 12.08 A 3.90 3.90 0 0 1 19.89 15.98 A 3.90 3.90 0 0 1 15.98 19.89 A 3.90 3.90 0 0 1 12.07 15.98 A 3.90 3.90 0 0 1 15.98 12.08 Z" fill="#f9f9f9" /></svg>
$sed-E的/([[:digit:][\[:digit:][]{2}][:digit:][]+/\1/g'file.svg

在Inkscape中设置精度:

较新版本:
Menubar |编辑|首选项|输入/输出| SVG输出|数字


旧版本:
Menubar |编辑| Inkscape首选项| SVG输出|数字

答案取决于如何将内容插入文件

如果手动复制a
.svg
文件的内容,并且必须手动使用上面的步骤缩小HTML,那么肯定有更好的方法:将主
.svgs
存储在一个名为
svgs
的文件夹中,并调用一个脚本来缩小它们。
svgs
到另一个名为
svgsminified
的文件夹中。这样,每次手动复制标记时,都会使用
svgsminified
文件夹中的缩小版本

如果您的IDE为您添加了
.svg
文件的标记,那么希望IDE中有一个脚本功能,允许您调用外部脚本来预先缩小传入的
标记

如果您使用的是Powershell(适用于*nix和Windows),则缩小文件夹中所有.svg的缩小脚本如下所示:

# All .svgs in $svg_dir will be minified into $svg_minified_dir
$svg_dir = 'D:/svg'
$svg_minified_dir = 'D:/svgs_minified'
Get-ChildItem $svg_dir -Filter *.svg | ForEach-Object {
    $svg_content = Get-Content $_.FullName -Raw
    $svg_minified = $svg_content -replace '(\.[0-9]{2})([0-9]{1,5})', '${1}'
    $svg_minified.Trim() | Out-File "$svg_minified_dir/$($_.Name)" -Encoding utf8 -NoNewline
}

要使用文本编辑器将定义修剪到x个小数位,只需使用Notepad++的正则表达式搜索模式:

  • 打开查找并替换为Ctrl+H
  • 将搜索模式更改为正则表达式
  • (\d+\.\d{x})\d*
    放入“查找内容”(将x替换为所需的位数)
  • \1
    替换为
  • 按全部替换
以您的示例得出以下结果:

之前:

之后:


您可以下载最新版本的Notepad++。

我非常有助于优化矢量编辑器中绘制的svg文件,
由Peter Collingridge制作的实用程序

界面是直观的,几乎在你开始工作的时候

结果很好:

  • 将文件大小减少近几倍
  • 删除Inkscape之后留下的所有服务信息
  • 可以选择小数位数

使用正则表达式方法将所有数字削减到小数点后两位是非常幼稚的。并非所有的小数都是相同的。例如,考虑下面的矩阵变换:

transform="matrix(0.999848,0.017452,-0.034905,0.999543,-4.0838,-3.8401)"
将这些数字减少到小数点后两位将使第二个数字更改41%。这有意义吗?是的,事实上,您可以使用它来获得很好的浮雕效果:


A.
A.
给定一个svg,其中包含:

<path id="hair" d="m208 14.2c-61.3 0-111 49.7-111 111 0 61.3 49.7 111 111 111 61.3 0 111-49.7 111-111-0.1-61.2-49.7-111-111-111z"/>
结果:

<path id="hair" d="m208 14c-61 0-111 50-111 111 0 61 50 111 111 111 61 0 111-50 111-111-0-61-50-111-111-111z"/>


多亏了

ccprog。感谢这两个非常有用的观察结果。到目前为止,我只对svg path语句应用了编辑,我选择了2dp,因为事实上我只需要1dp,而且我找不到一个要舍入而不是修剪的正则表达式语句。我无法访问Inkscape自行选择精度,因为SVG已经由其他人制作。但对我来说,这是一个非常有用的警告,不要将编辑应用于整个svg,因为其中许多svg中都有缩放和转换。
<path id="hair" d="m208 14.2c-61.3 0-111 49.7-111 111 0 61.3 49.7 111 111 111 61.3 0 111-49.7 111-111-0.1-61.2-49.7-111-111-111z"/>
perl -i -pe 's/(\d*\.\d*)/int($1+0.5)/ge' file
<path id="hair" d="m208 14c-61 0-111 50-111 111 0 61 50 111 111 111 61 0 111-50 111-111-0-61-50-111-111-111z"/>