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

Ste*_*ker 3 precision grep svg inkscape

我有一组从 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>
Run Code Online (Sandbox Code Playgroud)

所以我的问题是如何使用文本编辑器修剪定义以表示小数点后两位。

我发现通过使用 TextWrangler 和以下 grep 搜索并替换字符串

(\.[0-9][0-9])([0-9][0-9][0-9][0-9][0-9][0-9])
\1
Run Code Online (Sandbox Code Playgroud)

我可以搜索所有 6 个小数位字符串并将它们替换为 2 个小数位。然后我可以更改搜索并替换为

(\.[0-9][0-9])([0-9][0-9][0-9][0-9][0-9])
\1
Run Code Online (Sandbox Code Playgroud)

然后到

(\.[0-9][0-9])([0-9][0-9][0-9][0-9])
\1
Run Code Online (Sandbox Code Playgroud)

最后到

(\.[0-9][0-9])([0-9][0-9][0-9])
\1
Run Code Online (Sandbox Code Playgroud)

这有效。

然而,如果有人的大脑像素比我多一点(或很多),可以向我展示如何仅通过一次搜索和替换操作来完成上述所有操作,我会非常高兴。

Joh*_*024 5

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

sed -E 's/([[:digit:]]\.[[:digit:]]{2})[[:digit:]]+/\1/g' file.svg
Run Code Online (Sandbox Code Playgroud)

要就地更改文件 (Linux),

sed -i.bak -E 's/([[:digit:]]\.[[:digit:]]{2})[[:digit:]]+/\1/g' file.svg
Run Code Online (Sandbox Code Playgroud)

或操作系统:

sed -i .bak -E 's/([[:digit:]]\.[[:digit:]]{2})[[:digit:]]+/\1/g' file.svg
Run Code Online (Sandbox Code Playgroud)

怎么运行的

这将查找任何有数字、后跟句点、后跟两位数字、后跟一些数字的位置:

([[:digit:]]\.[[:digit:]]{2})[[:digit:]]+
Run Code Online (Sandbox Code Playgroud)

第一个数字、句点和后面的两个数字位于括号内。这会将它们保存到组 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>
Run Code Online (Sandbox Code Playgroud)

我们的命令:

$ 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>
Run Code Online (Sandbox Code Playgroud)