如何在 vim 中每 6 行后修改一行

How to modify a line after every 6 lines in vim

我有一个包含这些行的文件:

aaa
aaa
aaa
aaa
aaa
aaa
bbb
bbb
bbb
bbb
bbb
bbb
ccc
ccc
ccc
ccc
ccc
ccc
ddd
ddd
ddd
ddd
ddd
ddd

我想将其转换为:

aaa;100;
aaa
aaa
aaa
aaa
aaa
bbb;100;
bbb
bbb
bbb
bbb
bbb
ccc;100;
ccc
ccc
ccc
ccc
ccc
ddd;100;
ddd
ddd
ddd
ddd
ddd

这在 vim 中可以用一条命令实现吗?

这取决于您所说的 "one command" 是什么意思,但是您可以使用宏而无需为每个项目手动重复它:

  1. 将光标放在第一行
  2. 开始录制名为 z 的宏:qz
  3. 在行尾进入插入模式:<shift-A>
  4. 输入你想要的文字:;100;
  5. 退出插入模式:<esc>
  6. 往下跳六行:6j
  7. 停止录制宏:q
  8. 重复正确次数的宏:3@z

因为下跳6行是宏的一部分,所以会正确排列并循环文件。

这里的相关命令是q#开始录制宏,q结束录制,@#播放录制。

可以在各个地方找到更多信息,例如 vim wiki:http://vim.wikia.com/wiki/Macros

如果在更改之前所有行都是相同的,这是一个非常讨厌的 Vim 解决方案:

/\v(.*)\n\zs@!
:%g//norm A;100;

传统上,在 Vim 中,您首先进行搜索,然后使用 :%s//replace 将上次搜索替换为 "replace"。在一行中它将是:

:%g/\v(.*)\n\zs@!/norm A;100;

非常抱歉。这是 Vim 使用多年后发生的情况。不好看

解释:

本质上,我们是在查找下一行中没有重复的行,并对它们执行操作,在本例中,添加一些文本。

  • :%g/ 对模式执行操作(语法与 %s 相同)
  • \v非常神奇。使 Vim 正则表达式中的所有特殊字符变得特殊。
  • (.*)\n 后跟换行符的任何文本。捕获文本。
  • \zs 从这里开始突出显示匹配项。这会将光标置于匹配后的下一行,我们将在该行执行操作。
  • </code> 上面的捕获组 <code>(.*),所以换行具有相同的文本...
  • @!但是否定它!因此光标将移动到与上一行不重复的任何行。
  • /norm A;100; 执行正常模式命令 A;100;,它将在每一行上执行击键,就好像您处于正常模式下一样。此处为常规 Vim,仅附加 (A) 文本。
:%s/\v(.*)(\n.*)(\n.*)(\n.*)(\n.*)(\n.*\n)/;100;/

又一个

:g/^/ if !((line('.')-1)%6)|s/$/;100;

细分

  • g/^/ 在每一行应用下一个表达式的全局命令
  • if !((line('.')-1)%6)如果当前行的模数等于0
  • s/$/;100;替换以;100;
  • 结尾的行