Trim 文本编辑器中数字的小数位
Trim Decimal Places from Numbers in a Text Editor
我有一组从 Ink 中导出的 SVG 定义space,任何亲自执行过此操作的人都会知道生成的定义通常包含更准确的信息,这实际上是合理的。例如,对于如下所示的 32 x32 图标定义,Inkspace 已为每个像素生成 6(或更多!)个小数位精度。现在我知道这意味着它会缩放,但在我的情况下,我宁愿在我的应用程序中保存 space,这需要输入数百个这样的图标定义。
<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>
所以我的问题是如何使用文本编辑器trim定义小数点后两位。
我发现通过将 TextWrangler 与以下 grep 搜索和替换字符串一起使用
(\.[0-9][0-9])([0-9][0-9][0-9][0-9][0-9][0-9])
我可以搜索所有 6 位小数的字符串并将它们替换为 2 位小数。然后我可以将搜索和替换更改为
(\.[0-9][0-9])([0-9][0-9][0-9][0-9][0-9])
然后到
(\.[0-9][0-9])([0-9][0-9][0-9][0-9])
最后到
(\.[0-9][0-9])([0-9][0-9][0-9])
这行得通。
但是,如果有人的大脑像素比我多一点(或很多),可以告诉我如何通过一次搜索和替换操作完成上述所有操作,我将非常高兴。
要从(bash 或 shell)命令行中删除不需要的精度,请尝试:
sed -E 's/([[:digit:]]\.[[:digit:]]{2})[[:digit:]]+//g' file.svg
就地更改文件 (Linux),
sed -i.bak -E 's/([[:digit:]]\.[[:digit:]]{2})[[:digit:]]+//g' file.svg
或OSX:
sed -i .bak -E 's/([[:digit:]]\.[[:digit:]]{2})[[:digit:]]+//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>
我们的命令:
$ sed -E 's/([[:digit:]]\.[[:digit:]]{2})[[:digit:]]+//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>
在 Inkscape 中设置精度:
较新版本:Menubar | Edit | Preferences | Input/Output | SVG Output | Numbers
旧版本:Menubar | Edit | Inkscape Preferences | SVG Output | Numbers
答案取决于您将内容插入文件的方式。
如果您手动复制 .svg
文件的内容并且必须手动使用您上面执行的步骤来缩小 HTML,那么绝对有更好的方法:存储您的主要 .svgs
在一个名为 svgs
的文件夹中,然后调用一个脚本将这些 .svgs
缩小到另一个名为 svgsminified
的文件夹中。这样,每次您手动复制标记时,您都会使用 svgsminified
文件夹中的缩小版本。
如果您的 IDE 为您添加了 .svg
文件的标记,那么希望 IDE 中有一个脚本函数允许您调用外部脚本来预先缩小传入 <svg>
标记 .
如果您使用的是 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})', ''
$svg_minified.Trim() | Out-File "$svg_minified_dir/$($_.Name)" -Encoding utf8 -NoNewline
}
要trim 使用文本编辑器定义小数点后 x 位,您可以简单地使用 Notepad++ 的正则表达式搜索模式:
- 打开查找并用 Ctrl+H 替换
- 将搜索模式更改为正则表达式
- 在“查找内容”中输入
(\d+\.\d{x})\d*
(将 x 替换为您想要的位数)
- 将
替换为
- 按全部替换
你的例子的结果:
之前:
之后:
您可以下载最新版本的Notepad++ here。
我在优化 svg 文件方面很有帮助,在矢量编辑器中绘制,
Peter Collingridge 制作的实用程序 - SVG Editor
界面直观,几乎可以立即开始工作。
结果不错:
- 文件大小几乎减少了好几倍
- 删除 Inkscape
后留下的所有服务信息
- 小数位数有选择
使用 RegEx 方法将所有数字削减到两位小数是非常幼稚的。并非所有小数都是相同的。例如考虑以下矩阵变换:
transform="matrix(0.999848,0.017452,-0.034905,0.999543,-4.0838,-3.8401)"
将这些数字保留两位小数会将第二个数字改变 41%。这很重要吗?是的,事实上你可以用它来获得漂亮的压花效果:
<svg viewBox="0 0 20 20" width="100" height="100">
<text x="7" y="22" style="font-size:20;fill:#000000"
transform="matrix(0.999848,0.017452,-0.034905,0.999543,-4.0838,-3.8401)">A</text>
<text x="7" y="22" style="font-size:20;fill:#ffffff;opacity:0.8"
transform="matrix(0.99,0.01,-0.03,0.99,-4.08,-3.84)">A</text>
</svg>
这就是为什么 Inkscape 在其设置中使用术语 "precision" 并四舍五入到固定数量的 重要 数字(123.4, 0.01234,...)
第二个问题是您的 SVG 中某处可能有缩放转换。您是否在上面的代码片段中看到矩形的给定大小被缩放了 5 倍?它隐含在 viewBox
、ẁidth
和 height
属性中。如果缩放比例不是 5,而是 1000 怎么办?是的,我在野外见过这种关系。 特别是 如果图形是用 Inkscape 制作的。
所以:小心轻放。
给定一个 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(+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"/>
我有一组从 Ink 中导出的 SVG 定义space,任何亲自执行过此操作的人都会知道生成的定义通常包含更准确的信息,这实际上是合理的。例如,对于如下所示的 32 x32 图标定义,Inkspace 已为每个像素生成 6(或更多!)个小数位精度。现在我知道这意味着它会缩放,但在我的情况下,我宁愿在我的应用程序中保存 space,这需要输入数百个这样的图标定义。
<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>
所以我的问题是如何使用文本编辑器trim定义小数点后两位。
我发现通过将 TextWrangler 与以下 grep 搜索和替换字符串一起使用
(\.[0-9][0-9])([0-9][0-9][0-9][0-9][0-9][0-9])
我可以搜索所有 6 位小数的字符串并将它们替换为 2 位小数。然后我可以将搜索和替换更改为
(\.[0-9][0-9])([0-9][0-9][0-9][0-9][0-9])
然后到
(\.[0-9][0-9])([0-9][0-9][0-9][0-9])
最后到
(\.[0-9][0-9])([0-9][0-9][0-9])
这行得通。
但是,如果有人的大脑像素比我多一点(或很多),可以告诉我如何通过一次搜索和替换操作完成上述所有操作,我将非常高兴。
要从(bash 或 shell)命令行中删除不需要的精度,请尝试:
sed -E 's/([[:digit:]]\.[[:digit:]]{2})[[:digit:]]+//g' file.svg
就地更改文件 (Linux),
sed -i.bak -E 's/([[:digit:]]\.[[:digit:]]{2})[[:digit:]]+//g' file.svg
或OSX:
sed -i .bak -E 's/([[:digit:]]\.[[:digit:]]{2})[[:digit:]]+//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>
我们的命令:
$ sed -E 's/([[:digit:]]\.[[:digit:]]{2})[[:digit:]]+//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>
在 Inkscape 中设置精度:
较新版本:Menubar | Edit | Preferences | Input/Output | SVG Output | Numbers
旧版本:Menubar | Edit | Inkscape Preferences | SVG Output | Numbers
答案取决于您将内容插入文件的方式。
如果您手动复制 .svg
文件的内容并且必须手动使用您上面执行的步骤来缩小 HTML,那么绝对有更好的方法:存储您的主要 .svgs
在一个名为 svgs
的文件夹中,然后调用一个脚本将这些 .svgs
缩小到另一个名为 svgsminified
的文件夹中。这样,每次您手动复制标记时,您都会使用 svgsminified
文件夹中的缩小版本。
如果您的 IDE 为您添加了 .svg
文件的标记,那么希望 IDE 中有一个脚本函数允许您调用外部脚本来预先缩小传入 <svg>
标记 .
如果您使用的是 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})', ''
$svg_minified.Trim() | Out-File "$svg_minified_dir/$($_.Name)" -Encoding utf8 -NoNewline
}
要trim 使用文本编辑器定义小数点后 x 位,您可以简单地使用 Notepad++ 的正则表达式搜索模式:
- 打开查找并用 Ctrl+H 替换
- 将搜索模式更改为正则表达式
- 在“查找内容”中输入
(\d+\.\d{x})\d*
(将 x 替换为您想要的位数) - 将
替换为
- 按全部替换
你的例子的结果:
之前:
之后:
您可以下载最新版本的Notepad++ here。
我在优化 svg 文件方面很有帮助,在矢量编辑器中绘制,
Peter Collingridge 制作的实用程序 - SVG Editor
界面直观,几乎可以立即开始工作。
结果不错:
- 文件大小几乎减少了好几倍
- 删除 Inkscape 后留下的所有服务信息
- 小数位数有选择
使用 RegEx 方法将所有数字削减到两位小数是非常幼稚的。并非所有小数都是相同的。例如考虑以下矩阵变换:
transform="matrix(0.999848,0.017452,-0.034905,0.999543,-4.0838,-3.8401)"
将这些数字保留两位小数会将第二个数字改变 41%。这很重要吗?是的,事实上你可以用它来获得漂亮的压花效果:
<svg viewBox="0 0 20 20" width="100" height="100">
<text x="7" y="22" style="font-size:20;fill:#000000"
transform="matrix(0.999848,0.017452,-0.034905,0.999543,-4.0838,-3.8401)">A</text>
<text x="7" y="22" style="font-size:20;fill:#ffffff;opacity:0.8"
transform="matrix(0.99,0.01,-0.03,0.99,-4.08,-3.84)">A</text>
</svg>
这就是为什么 Inkscape 在其设置中使用术语 "precision" 并四舍五入到固定数量的 重要 数字(123.4, 0.01234,...)
第二个问题是您的 SVG 中某处可能有缩放转换。您是否在上面的代码片段中看到矩形的给定大小被缩放了 5 倍?它隐含在 viewBox
、ẁidth
和 height
属性中。如果缩放比例不是 5,而是 1000 怎么办?是的,我在野外见过这种关系。 特别是 如果图形是用 Inkscape 制作的。
所以:小心轻放。
给定一个 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(+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"/>