我试图在vim下进行以下替换:
"a": 1,
"b": 2,
"c": 3
到
"a": d["a"],
"b": d["b"],
"c": d["c"]
似乎vim下的正则表达式与普通正则表达式不同。任何人都能帮助我吗?
由于
答案 0 :(得分:2)
您的文件包含冒号和全角冒号,这使得替换有点难以处理。
如果您在光标位于第一个和第二行上的ga
字符上方时键入:
,您会发现它们不一样。
事实上,对于第一行,您将获得全宽冒号:
<:> 65306, Hexa ff1a, Octal 177432
和第二&amp;第三行,您将获得已知的冒号:
<:> 58, Hexa 3a, Octal 072
为了替换两个冒号,您可以执行以下命令:
:%s/\v("\w+")\s*(:|%uFF1A)\s*\d+(,?)/\1: d[\1]\3/g
您可以注意到第二组中的 %uFF1A
,它以十六进制表示法表示全宽冒号。
答案 1 :(得分:0)
您可以选择使用递归宏。
在第一行,清空q寄存器
qqq
启动q宏
qq
做一次工作并通过回忆完成宏(这就是你必须先清空q寄存器的原因)。
0yt:f ad[]<ESC>Pf]lC,<ESC>j0@q
在这里,我们:
然后你停止编辑宏
q
你执行它
@q
您也可以尝试此替换
:%s/^\("\S\{-}"\): \d\+\(,\?\)$/\1: d[\1]\2/
答案 2 :(得分:-2)
%s/^\(.*\):.\{-\}\(,\|\)$/\1: d[\1]\2/
很多正则表达式引擎都不同,我不知道有正常的#34;&#34;正则表达式; Vim是一个很旧的,需要转义括号以创建组\(\)
,因此匹配计数\{\}
的大括号和.*?
不支持非贪婪匹配成为.\{-\}
。
匹配
并替换为group 1: d[group 1]group2