Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在文本文件中的字符匹配后插入小数_Regex_Csv_Unix_Awk_Sed - Fatal编程技术网

Regex 在文本文件中的字符匹配后插入小数

Regex 在文本文件中的字符匹配后插入小数,regex,csv,unix,awk,sed,Regex,Csv,Unix,Awk,Sed,我有一个CSV文件,其中包含一些数据值。当字符串有3个值时,我需要在第二个字符后插入一个小数点,当字符串有4个值时,我需要在第三个字符后插入一个小数点 CSV文件: 尝试的代码: 当前结果: 预期结果: 我当前使用sed的代码似乎适用于3值字符串,但在检测到4值字符串时失败。您可以在一个组中捕获2个或更多数字,然后在另一个组中捕获尾随数字: s='956,938,987,964,1004,934,1018,912' echo $s | sed 's/\([0-9]\{2,\}\)\([0-9]\

我有一个CSV文件,其中包含一些数据值。当字符串有3个值时,我需要在第二个字符后插入一个小数点,当字符串有4个值时,我需要在第三个字符后插入一个小数点

CSV文件:

尝试的代码:

当前结果:

预期结果:


我当前使用sed的代码似乎适用于3值字符串,但在检测到4值字符串时失败。

您可以在一个组中捕获2个或更多数字,然后在另一个组中捕获尾随数字:

s='956,938,987,964,1004,934,1018,912'
echo $s | sed 's/\([0-9]\{2,\}\)\([0-9]\)/\1.\2/g'
参见,输出:95.6,93.8,98.7,96.4100.4,93.4101.8,91.2

详情:

\[0-9]\{2,\}\-第1组:两个或更多\{2,\}位[0-9] \[0-9]\-第2组:单个数字。
您可以将2个或更多数字捕获到一个组中,然后将尾随数字捕获到另一个组中:

s='956,938,987,964,1004,934,1018,912'
echo $s | sed 's/\([0-9]\{2,\}\)\([0-9]\)/\1.\2/g'
参见,输出:95.6,93.8,98.7,96.4100.4,93.4101.8,91.2

详情:

\[0-9]\{2,\}\-第1组:两个或更多\{2,\}位[0-9] \[0-9]\-第2组:单个数字。
简单地更换一下怎么样

\B([0-9])\b

说明:

\如果匹配的位置在字/数序列中而不是字边界中,则B匹配 [0-9]匹配并捕获一个数字 \如果所匹配的位置位于单词/数字边界上,则b匹配

通过你的例子,我想你只是想让所有的数字都有一个小数点。这个正则表达式的作用是匹配并捕获多位数中的最后一个数字。将其自身替换为前面的。为您提供所需的输出

以及更直观的说明

编辑

如果Wiktors的担忧是一个问题,请将其更改为

\B([0-9])([0-9])\b
取代

\1.\2


.

简单地更换一下怎么样

\B([0-9])\b

说明:

\如果匹配的位置在字/数序列中而不是字边界中,则B匹配 [0-9]匹配并捕获一个数字 \如果所匹配的位置位于单词/数字边界上,则b匹配

通过你的例子,我想你只是想让所有的数字都有一个小数点。这个正则表达式的作用是匹配并捕获多位数中的最后一个数字。将其自身替换为前面的。为您提供所需的输出

以及更直观的说明

编辑

如果Wiktors的担忧是一个问题,请将其更改为

\B([0-9])([0-9])\b
取代

\1.\2

在awk中:

$ awk '{gsub(/.(,|$)/,".&")}1' file
95.6,93.8,98.7,96.4,100.4,93.4,101.8,91.2
万一有空间或其他东西,你可以:

$ awk '{gsub(/[0-9] *(,|$)/,".&")}1' file
在awk中:

$ awk '{gsub(/.(,|$)/,".&")}1' file
95.6,93.8,98.7,96.4,100.4,93.4,101.8,91.2
万一有空间或其他东西,你可以:

$ awk '{gsub(/[0-9] *(,|$)/,".&")}1' file
看起来您只是将所有数字除以10,因此可以使用此非正则表达式方法:

awk 'BEGIN{FS=OFS=","} {for (i=1; i<=NF; i++) $i/=10} 1' file

95.6,93.8,98.7,96.4,100.4,93.4,101.8,91.2
看起来您只是将所有数字除以10,因此可以使用此非正则表达式方法:

awk 'BEGIN{FS=OFS=","} {for (i=1; i<=NF; i++) $i/=10} 1' file

95.6,93.8,98.7,96.4,100.4,93.4,101.8,91.2

\d\b也将添加。如果是1。它将输出.1,OP只需添加。如果一个数字有3个以上的数字,至少我是这样理解的\B\d\B将添加一个。在24.2.4中的2和4之间-同样,不确定这是OP所期望的。@WiktorStribiżew True。修正:不确定,我更新了评论。此外,sed中不使用$1。符号为\1。请避免在在线正则表达式网站上查询sed/awk/grep/etc上的问题。。。使用的正则表达式的味道有很多不同。。例如:\d不能与sed一起使用,需要使用[0-9]来代替。。。而且\b和\b是特定于GNU-sed的,不适用于其他implementations@Sundeep作为一个Windows的家伙,我知道的不多。已更改为至少与sed兼容,因为在问题中已将其用作示例。已测试并正在工作:\d\b还将添加。如果是1。它将输出.1,OP只需添加。如果一个数字有3个以上的数字,至少我是这样理解的\B\d\B将添加一个。在24.2.4中的2和4之间-同样,不确定这是OP所期望的。@WiktorStribiżew True。修正:不确定,我更新了评论。此外,sed中不使用$1。符号为\1。请避免在在线正则表达式网站上查询sed/awk/grep/etc上的问题。。。使用的正则表达式的味道有很多不同。。例如:\d不能与sed一起使用,需要使用[0-9]来代替。。。而且\b和\b是特定于GNU-sed的,不适用于其他implementations@Sundeep作为一个Windows的家伙,我知道的不多。已更改为至少与sed兼容,因为在问题中已将其用作示例。测试和工作:想法是好的,但我认为你需要在特定的格式打印。。。例如:echo'34535235'| awk'BEGIN{FS=OFS=,}{i=1;同样,echo 1000 | awk…输出100。根据OP的需要,这可能是一件好事。主意不错,但我认为您需要以特定格式打印…例如:echo'34535235'| awk'BEGIN{FS=OFS=,}{对于i=1;iAlso,echo 1000 | awk…输出100。根据OP的需要,这可能是一件好事。