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

时间:2015-01-26 04:52:39

标签: 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?

4 个答案:

答案 0 :(得分:6)

还有一个

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

<强>击穿

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

答案 1 :(得分:4)

这取决于你对“一个命令”的意思,但你可以不使用宏为每个项目手动重复它:

  1. 将光标放在第一行
  2. 开始录制名为z的宏:qz
  3. 在行尾添加插入模式:<shift-A>
  4. 输入您想要的文字:;100;
  5. 退出插入模式:<esc>
  6. 跳下六行:6j
  7. 停止录制宏:q
  8. 多次重复使用正确的数字:3@z
  9. 因为跳下6行是宏的一部分,所以它会正确排列并循环遍历文件。

    此处的相关命令为q#以开始录制宏,q以结束录制,@#播放录制内容。

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

答案 2 :(得分:1)

如果在更改之前线条完全相同,这是一个非常讨厌的Vim解决方案:

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

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

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

我很抱歉。这是Vim使用多年后发生的事情。它不漂亮。

<强>解释

基本上我们找到的行不会在下一行重复,并对它们执行操作,在这种情况下,添加一些文本。

  • :%g/对模式执行操作(语法与%s相同)
  • \v非常神奇。使Vim正则表达式中的所有特殊字符都特殊。
  • (.*)\n任何文字后跟换行符。捕捉文字。
  • \zs在此处开始突出显示匹配项。这会将光标放在匹配后的下一行,我们将执行操作。
  • \1上方(.*)的捕获群组,因此新文字内容相同...
  • @!但否定它!因此,光标将转到上一行未复制的任何行。
  • /norm A;100;执行普通模式命令A;100;,它将在每条线上执行击键,就像您处于正常模式一样。这里有常规Vim,只需追加(A)文字。

答案 3 :(得分:-1)

:%s/\v(.*)(\n.*)(\n.*)(\n.*)(\n.*)(\n.*\n)/\1;100;\2\3\4\5\6/