seq 小数点分隔符

seq 小数点分隔符

使用seq带有浮点数的命令,尽管在输入中使用了点,但我的输出还是以逗号而不是点作为小数分隔符:

seq 0.1 0.3 1.3
0,1
0,4
0,7
1,0
1,3

我认为这与 locale 链接LC_NUMERIC,该 locale 设置为de_DE.UTF-8,但是更改为en_US.UTF-8并没有修复它,并且我使用完全相同的区域设置的另一个系统确实返回点。即使通过例如显式定义格式-f %1.2也不会返回点,而是返回逗号作为小数分隔符。

我在哪里以及如何改变这种行为?如何确保我的脚本在任何给定系统上都不会出现错误?显然,如果不通过tr类似方式重新处理,任何输出都将无法用于进一步处理。

在德国时区使用英语安装的 Mint,在另一台机器上使用 raspian。


编辑:locale给定机器上的设置:

“逗号”一:

LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=

“点”一:

LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="C.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=

设置LANGUAGE不影响结果。

答案1

为了排除语言环境本身的错误,我(重新)生成了de_DE.UTF-8en_US.UTF-8通过

dpkg-reconfigure locales

现在seq行为似乎取决于LC_NUMERIC LANG

如果LC_NUMERIC未设置/为空,则LANG定义行为,否则分别LC_NUMERIC在逗号和点之间de_DE.UTF-8切换。en_US.UTF-8


具体危险

LANG在为和 非基于点设置错误/不存在的值的情况下locale,在某些特殊情况下行为可能会混合,例如

LANG=en_US
#it should be en_US.UTF-8
LC_NUMERIC=de_DE.UTF-8

seq 0.1 0.2 1.3
0.1
0.3
0.5
0.7
0.9
1.1
1,3

它不仅出现,seq 0.1 0.2 1.4而且也出现seq 0.1 0.2 1.9- 非常奇怪且恕我直言非常危险的行为。因此,请注意seq任何脚本的可移植性或定义区域设置。

大胆猜测,这似乎与特定情况下的一些手动更改有关(请参阅:https://lists.gnu.org/archive/html/bug-coreutils/2008-09/msg00192.html


更新:

为了避免由于本地化输出格式而导致任何错误,维护者建议在脚本本身中定义区域设置 ( LC_NUMERIC=C)。改变这种行为并没有计划。 (请参阅下面带有补丁的链接线程)

由于区域设置错误而导致混合点和逗号输出的问题已被识别为错误,并已由维护人员修补:

https://lists.gnu.org/archive/html/coreutils/2019-02/msg00002.html

相关内容