说我有这段文字:
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
答案 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