有一个包含两个字段的文件,其中以 :(冒号)分隔,如下所示:
Ram:con_[3:4]_aen[52:7]
Rakesh:sync[0:128]
我需要使用 vim 编辑器将括号 [] 中的 :(冒号) 转换为 !如下所示 :
Ram:con_[3!4]_aen[52!7]
Rakesh:sync[0!128]
我尝试了这个,但没有得到如上所示的输出。
:%s/[%d:%d]/[%d!%d]/g
答案1
你可以使用:
%s/\(\d\+\)\@<=:/!/g
\(\d\+\)
求一个小数
\@<=
采取积极的回顾。正向后看意味着前一个模式(在本例中为上面的模式)需要与下一个符号匹配。您可以阅读更多 VIM 如何实现这一点这里。
:
匹配':'。
答案2
您可以使用
:%s/\([[0-9]\+\):\([0-9]\+]\)/\1!\2/g
看到我们已经将元素[number1
和number2]
与\([[0-9]\+\)
和进行了分组,\([0-9]\+]\)
并复制了第一个元素\1
和第二个元素\2
,并在它们之间放置了一个!
。
我曾经用来表示一位或多位数字,但如果您确定冒号和每个括号之间始终有一个数字,[0-9]\+
则可以简化为(这意味着零个或多个数字):[0-9]*
:%s/\([[0-9]*\):\([0-9]*]\)/\1!\2/g
答案3
:%s/\v\(\[[0-9]+):([0-9]+\])/\1!\2/g
\v
启用额外的正则表达式功能
(\[[0-9]+)
左括号和至少一位数字的捕获组
:
你不想要的冒号
([0-9]+\])
至少一位数字和右括号的捕获组
\1!\2
两个捕获组的内容以及您想要的爆炸