在文本文件

时间:2017-07-13 12:36:19

标签: regex csv unix awk sed

我有一个包含一些数据值的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值字符串时失败。

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 demohere at regex101以获得更直观的插图。

修改

如果Wikors担心是一个问题,请将其更改为

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

替换为

\1.\2

sed 's/\B\([0-9]\)\([0-9]\)\b/\1.\2/g'

Here at regex101

答案 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