Mic*_*ber 10
你想要多严谨?您可以.像其他人所建议的那样更改所有字符,但如果您拥有的不仅仅是数字,那么这将允许很多误报.更严格的是要求点的两边都有数字:
$ echo 123.324 2314.234 adfdasf.324 1234123.daf 255.255.255.0 adsf.asdf a1.1a |
> sed 's/\([[:digit:]]\)\.\([[:digit:]]\)/\1,\2/g'
123,324 2314,234 adfdasf.324 1234123.daf 255,255,255,0 adsf.asdf a1,1a
Run Code Online (Sandbox Code Playgroud)
这确实允许一对夫妇的多宗,即变化255.255.255.0和a1.1a,但干净处理"正常"的数字.
这不会更准确,因为OP谈论数字......以确保它是点之前的前导数字.该文件可能包含OP不想替代的其他点.
sed '/[0-9]\./s/\./,/g'
Run Code Online (Sandbox Code Playgroud)
在大多数情况下tr,可能是替换字符的最简单方法:
$ echo "0.3"|tr '.' ','
0,3
Run Code Online (Sandbox Code Playgroud)
当然,如果您处理输入混合数字和字符串,您将需要一种更健壮的方法,例如 Michael J. Barber 提出的方法,甚至更多。
默认情况下gawk(GNU awk,即awk大多数 GNU/Linux 发行版)使用点作为小数点分隔符:
$ echo $LC_NUMERIC
fr_FR.UTF-8
$ echo "0.1 0.2"|awk '{print $1+$2}'
0.3
$ echo "0,1 0,2"|awk '{print $1+$2}'
0
Run Code Online (Sandbox Code Playgroud)
但是,您可以使用--use-lc-numeric选项强制它使用当前语言环境的小数点分隔符:
$ echo $LC_NUMERIC
fr_FR.UTF-8
$ echo "0.1 0.2"|awk --use-lc-numeric '{print $1+$2}'
0
$ echo "0,1 0,2"|awk --use-lc-numeric '{print $1+$2}'
0,3
Run Code Online (Sandbox Code Playgroud)
如果输入格式与当前语言环境不同,当然可以临时重新定义 LC_NUMERIC :
$ echo $LC_NUMERIC
fr_FR.UTF-8
$ echo "0.1 0.2"|LC_NUMERIC=en_US.UTF-8 awk --use-lc-numeric '{print $1+$2}'
0
$ echo "0,1 0,2"|LC_NUMERIC=fr_FR.UTF-8 awk --use-lc-numeric '{print $1+$2}'
0,3
Run Code Online (Sandbox Code Playgroud)
(学分和其他链接)