Vim:s替换行中前N个<g次出现


13

在vim中,有时我会替换行中前几次匹配项,但是并不是每个人都愿意替换g。例如:

a a a a a

b b b a a

我知道我可以使用:s/a/b/[enter]:[up][enter]:[up][enter],但是在三个重复中就很乏味了,我的行可能有10个以上的替换。
我试过了:

  • :s/a/b/3g:vim抱怨尾随字符。
  • :s/a/b/3:更改此行以及随后两行中的第一个匹配项。
  • 3:s/a/b:与以前相同。
  • :s/a/b/g3:更改此行以及随后两行的所有匹配项。
  • :3s/a/b:更改第3行上的第一个匹配项。
  • :/a/,3/a/s/a/b:更改文件中a包含的下一行和第三行之间的每一行的第一个匹配项a(如有必要,提示反转)。
  • :/a/,/\([^a]*a\)\{3\}/s/a/b/:更改此行与第二行之间每行的第一个匹配项,并在其上加上3 as(而且对于多字符搜索而言,这很难扩展)。

还有其他各种寻址模式,没有一种有效。我必须说,关于:s尝试找到该问题答案的命令,我已经学到了很多东西,但是我仍然没有解决。

有人知道怎么做吗?

(特定范围的奖励点,例如第二到第四次出现)


2
我敢肯定,您不能在vim中做到这一点,但是为了使它不那么乏味,您知道“ n”和“”吗。在视觉模式下?也就是说,您使用/ pattern /查找要更改的内容,使用“ cw”或其他方式进行更改,然后使用“ n”(仅n,不带引号)查找下一个模式并单击“”。(只是句号,没有引号)以执行最后的编辑。
Bruce Ediger

@BruceEdiger我也知道n.,虽然我没想到在这里使用它们。当然可以改善,谢谢。
凯文

s/a/=something/应该做的把戏(:help sub-replace-=)。我对Vim的流利程度不足以立即完成写作something
吉尔(Gilles)“所以,别再邪恶了”,

注意::[up][enter]可以替换为&,这仍然不是理想选择,但至少减轻了痛苦。
科夫(Kowh)2011年

Answers:


10

基于:s/pattern/replacement/gc Samus_想法(当替换字符串中包含模式时,这似乎是确保正确操作的最简单方法),可以在一行上替换第二到第四次出现的事件:

:call feedkeys("nyyyq") | s/pat/string/gc

feedkeys()是将输入字符串填充到键盘输入队列中的函数。关键是要预先进行计数,因此您不必担心丢失计数或被打扰。

对于更一般的情况下,以取代第M通过第N个事件上的单个线Ñ大于或等于一个非常大的中号

:call feedkeys(repeat("n", M-1) . repeat("y", N-M+1) . "q") | s/pat/string/gc

用所需的值替换MNvim如果您不想自己做,甚至可以做一些琐碎的心理算术)。请注意,这.是VimL的字符串连接运算符。显然,这仅节省了大M的击键。如果您经常使用此功能,则可能需要花很多时间才能将上面的内容放入某种自定义命令或某种功能中。


嗯 我喜欢这个。我也应该能够为此编写一个函数。
凯文

8

对于第一个问题,我将要做:

:s/a/b
&&

第二个比较棘手,我不知道自动执行此操作的方法,但是您可以使vim在每次比赛中都这样提示您:

:s/a/b/gc

然后,您对前n个匹配项回答“否”,对其他匹配项回答“是”。


嗯,我忘记了c,那可能是目前提出的最佳解决方案。我仍然需要数数,但是我认为这是第一个可以与包含搜索字符串的替换一起使用的选项。
凯文

6
a a a a a
a a a a a
a a a a a
a a a a a
a a a a a
a a a a a
a a a a a

:3,6g/^/let i=0 | while i<3 | s/a/b/ | let i+=1 | endwhile

a a a a a
a a a a a
b b b a a
b b b a a
b b b a a
b b b a a
a a a a a

1
这很好,但是仍然遭受Gilles指出的问题(在另一篇文章中,此后似乎已被删除),该问题仅在替换不包含模式的情况下才有效。虽然我喜欢脚本编写的想法。
凯文

美丽的东西!
主教

1

我认为这可能有效,请先更换,然后重复2次:

:s/a/b/
2@:
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.