如何在 vim 中替换被阻止的文本中的所有相同文本?

  • 本文关键字:文本 vim 替换 vim
  • 更新时间 :
  • 英文 :


如何更改此代码:

dayHour: {
sunday: {
openHour: null,
closeHour: null,
},
monday: {
openHour: null,
closeHour: null,
},
tuesday: {
openHour: null,
closeHour: null,
},
wednesday: {
openHour: null,
closeHour: null,
},
thursday: {
openHour: null,
closeHour: null,
},
...
}

到此代码:

dayHour: {
sunday: {
openHour: null,
closeHour: null,
openMenu: null,
closeMenu: null
},
monday: {
openHour: null,
closeHour: null,
openMenu: null,
closeMenu: null
},
tuesday: {
openHour: null,
closeHour: null,
openMenu: null,
closeMenu: null
},
wednesday: {
openHour: null,
closeHour: null,
openMenu: null,
closeMenu: null
},
thursday: {
openHour: null,
closeHour: null,
openMenu: null,
closeMenu: null
},
...
}

这是我尝试过的,我阻止了文本:

openHour: null,
closeHour: null

我不知道下一步该怎么做才能找到并替换我阻止的文本。 我在谷歌上搜索了几个问题,但我什么也没找到,甚至不知道要搜索什么关键字。谢谢

这是一种非常常见的技术:使用:global来匹配您想要的行。然后可以输入编辑命令,例如,使用:normal

g/closeHour/normal! oopenMenu: null,^McloseMenu: null

此处必须输入^M^V<Enter>

如果您的替换文本已经拉入寄存器,您也可以将其放入:

g/closeHour/normal! ]p

(注意:可以将normal! ]p更改为put,但可能需要额外的缩进修复,例如='[(。

您可以使用此替换命令:

:%s/(openHour: null,ns*closeHour: null,?)/1r      openMenu: null,r      closeMenu: null/

您甚至可以复制缩进:

:%s/(s*)(openHour: null,ns*closeHour: null,?)/12r1openMenu: null,r1closeMenu: null/

有关详细信息,请参阅:help :s。 如果您愿意,我也可以解释该命令。

我尝试使用子匹配:

/openHour_.{-}clos.*
:%s//=submatch(0) . "r          " . substitute(submatch(0), 'Hour', 'Menu', 'g')/g

第一次使用多行搜索(非贪婪正则表达式(_.{-}.我们可以简单地引用我们的搜索//.之后,我们使用submatch(0)加上带有一些"r "空格的换行符重新插入搜索,然后使用替换搜索的修改版本。

.用于连接我们的字符串。

@matt答案可以更改为:

:g/closeHour/exec "normal!oopenMenu: null, <Enter>closeMenu: null"

使用双引号,我们可以使用像<Enter>这样的按键,而不是许多用户不理解的经典^M,因此它更清晰。我认为第二个@matt解决方案是正确的,它更容易打字并且直截了当。

如果它已经在剪贴板上,我们可以通过以下方式指示,而不是将所需的文本复制到任何寄存器:"+]p,因此它将是:

:g/closeHour/normal! "+]p

最新更新