Vim替换为组

时间:2016-08-09 21:43:33

标签: vim replace

我试图在vim下进行以下替换:

"a": 1,
"b": 2,
"c": 3

"a": d["a"],
"b": d["b"],
"c": d["c"]

似乎vim下的正则表达式与普通正则表达式不同。任何人都能帮助我吗?

由于

3 个答案:

答案 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

在这里,我们:

  • 转到第一个字符
  • 抽到专栏
  • 移动到下一个空白字符
  • 在光标d []
  • 之后插入
  • 退出插入模式
  • 在光标前粘贴
  • 转到] char
  • 再次向右移动
  • 用逗号替换行尾
  • 退出插入模式
  • 通过转到下一行准备下一次执行宏
  • 再次调用宏

然后你停止编辑宏

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