【问题标题】:Replace some dots(.) with commas(,) with RegEx and awk or sed使用 RegEx 和 awk 或 sed 将一些点 (.) 替换为逗号 (,)
【发布时间】:2018-05-03 21:29:45
【问题描述】:

我想用逗号替换一些但不是所有匹配的点:

hostname_metric (Index: 1) to hostname;metric (avg);22.04.2015 13:40:00;3.0000;22.04.2015 02:05:00;2.0000;22.04.2015 02:00:00;650.7000;2.2594;

结果应该是这样的:

hostname_metric (Index: 1) to hostname;metric (avg);22.04.2015 13:40:00;3,0000;22.04.2015 02:05:00;2,0000;22.04.2015 02:00:00;650,7000;2,2594;

我能够识别应该可以找到正确点的正则表达式。

;[0-9]{1,}\.[0-9]{4}

但是如何用 awk 或 sed 的逗号替换它们?

提前致谢!

【问题讨论】:

  • 当你可以使用[0-9]时,你为什么还要使用[0-9]{1,}

标签: regex bash awk sed


【解决方案1】:

在您的问题中向正则表达式添加一些捕获组,您可以使用此 sed 单线:

sed -r 's/(;[0-9]{1,})\.([0-9]{4})/\1,\2/g' file

这匹配并捕获. 之前和之后的部分,并在替换字符串中使用它们。

在某些版本的 sed 上,您可能需要使用 -E 而不是 -r 来启用扩展正则表达式。如果您的 sed 版本不理解任一开关,您可以使用基本的正则表达式并添加一些转义字符:

sed 's/\(;[0-9]\{1,\}\)\.\([0-9]\{4\}\)/\1,\2/g' file

【讨论】:

  • 它适用于 RHEL,但我需要它才能在 Solaris 上运行。我认为这不会有任何区别,但我做到了: sed: command garbled: s/(;[0-9]\{1,\})\.([0-9]\{4\})/\ 1,\2/g
  • 第二个示例应该可以工作 - 看起来您缺少括号周围的转义字符。
  • 我这样做了:bash# sed 's/(;[0-9]\{1,\})\.([0-9]\{4\})/\1, \2/g' 文件 > 文件正确
  • 好的,找到了:sed 's/(;[0-9]\{1,\})\.([0-9]\{4\})/\1,\ 2/g'文件
  • @sunn_bmixer 我的回答中实际上有一个错字......对此感到抱歉。
【解决方案2】:

sed 's/\(;[0-9]\+\)\.\([0-9]\{4\}\)/\1,\2/g' 应该可以解决问题。

【讨论】:

  • OP谈到用逗号(,)替换一些点(。)用正则表达式和前后显示的字符串有143个字符,两者之间的区别是4个点(。)是替换为逗号(,),但两个字符串的长度仍为 143 个字符。使用您建议的 sed 命令,在将点 (.) 替换为逗号 (,) 之前删除了前导分号 (;) 后,输出字符串只有 139 个字符长。很明显,这个解决方案最终失败了,即使它替换了目标字符并且 IMO 不应该被投票赞成。 imgur.com/GkeO34G
猜你喜欢
  • 2014-03-24
  • 2011-09-14
  • 2018-09-20
  • 1970-01-01
  • 2011-06-18
  • 2019-05-02
  • 1970-01-01
  • 2017-11-11
  • 2017-08-13
相关资源
最近更新 更多