在行的右侧部分用下划线替换点

时间:2016-11-22 20:59:49

标签: regex sed

说我有这段文字:

some.blah.key={{blah.woot.wiz}}
some.another.foo.key={{foo.bar.qix.name}}
+ many other lines with a variable number of words separated by dots within {{ and }}

在右侧部分(在{{}}分隔符之间)用下划线替换点后,我想要以下结果:

some.blah.key={{blah_woot_wiz}}
some.another.foo.key={{foo_bar_qix_name}}
...

我正在寻找合适的正则表达式来执行单行sed命令中的替换。

我在这个方面处于领先地位:https://regex101.com/r/8wsLHo/1但是它捕捉了所有的点,包括左边的那些点,我不想要。 我尝试了这种变体来排除左侧部分,但之后它不再捕获任何内容:https://regex101.com/r/d7WAmX/1

2 个答案:

答案 0 :(得分:4)

您可以使用循环:

sed ':a;s/\({{[^}]*\)\./\1_/;ta' file

:a定义标签“a”
当某些东西被替换时,ta会跳到“a”。

答案 1 :(得分:2)

我想出了这个相当复杂的单行:

sed "h;s/=.*/=/;x;s/.*=//;s/\./_/g;H;x;s/\n//"

说明:

  • h:将行放入保留缓冲区
  • s/=.*/=/:在=
  • 之后的右侧部分
  • x:交换再次将行放入主缓冲区,第一部分放在保持缓冲区
  • s/.*=//:clobber在=
  • 之前离开了部分
  • s/\./_/g:由于主缓冲区中只有正确的部分,所以执行点的替换
  • H:追加主缓冲区以保存缓冲区
  • x:再次交换缓冲区
  • s/\n//:删除换行符或两个部分显示在单独的行中

这很有趣,但也许sed不是执行该操作的最佳工具,而是属于code golf