我有一个包含一些数据值的CSV文件。当字符串有3个值时,我需要在第二个字符后插入一个小数点,当字符串有4个值时,我需要在第三个字符后插入一个小数点。
CSV文件:
956,938,987,964,1004,934,1018,912
尝试过的代码:
sed -e "s/\([0-9]\{2\}\)/\1./g"
当前结果:
95.6,93.8,98.7,96.4,10.04.,93.4,10.18.,91.2
预期结果:
95.6,93.8,98.7,96.4,100.4,93.4,101.8,91.2
我当前的代码(使用sed
)似乎适用于3值字符串,但是当它检测到4值字符串时失败。
答案 0 :(得分:2)
您可以将2个或更多数字捕获到1个组中,然后将尾随数字捕获到另一个组中:
95.6,93.8,98.7,96.4,100.4,93.4,101.8,91.2
请参阅online demo,输出:\([0-9]\{2,\}\)
。
<强>详情:
\{2,\}
- 第1组:两个或更多([0-9]
)个数字(\([0-9]\)
)WHERE admin.username LIKE '".$usernameDB."%'"
- 第2组:单个数字。答案 1 :(得分:2)
如何简单地替换
\B([0-9])\b
与
.\1
喜欢
sed 's/\B\([0-9]\)\b/.\1/g'
说明:
\B
匹配,如果匹配的位置是 一个字/数字序列(不是字边界)
([0-9])
匹配和捕获数字
\b
如果匹配的位置位于 字/数字边界
通过你的例子我收集你只想让所有数字都有一个小数。这个正则表达式的作用是匹配和捕获多位数字中的最后一位数字。用.
替换它本身就可以得到所需的输出。
Online demo和here at regex101以获得更直观的插图。
修改强>
如果Wikors担心是一个问题,请将其更改为
\B([0-9])([0-9])\b
替换为
\1.\2
像
sed 's/\B\([0-9]\)\([0-9]\)\b/\1.\2/g'
答案 2 :(得分: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
答案 3 :(得分:1)
看起来您只是将所有数字除以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