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

如何在vim中每6行后修改一行,vim,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中,一个命令可以实

我有一个包含以下行的文件:

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中,一个命令可以实现这一点吗

这取决于您所说的一个命令的含义,但您可以通过使用宏,不必为每个项目手动重复该命令:

将光标放在第一行上 开始录制名为z:qz的宏 在行尾输入插入模式: 输入所需的文本:;100; 退出插入模式: 跳下六行:6j 停止录制宏:q 按正确的次数重复宏多次:3@z 由于向下跳6行是宏的一部分,因此它将正确对齐并在文件中循环

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


更多信息可以在不同的地方找到,例如vim wiki:

,这取决于您所说的一个命令的含义,但是您可以通过使用宏对每个项目手动重复它:

将光标放在第一行上 开始录制名为z:qz的宏 在行尾输入插入模式: 输入所需的文本:;100; 退出插入模式: 跳下六行:6j 停止录制宏:q 按正确的次数重复宏多次:3@z 由于向下跳6行是宏的一部分,因此它将正确对齐并在文件中循环

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


更多信息可以在不同的地方找到,比如vim wiki:

如果在更改之前所有的行都是相同的,那么这是一个非常糟糕的vim解决方案:

/\v(.*)\n\zs\1@!
:%g//norm A;100;
传统上,在Vim中,您首先创建搜索,然后使用:%s//replace将上一次搜索替换为replace。一行是:

:%g/\v(.*)\n\zs\1@!/norm A;100;
我很抱歉。这就是多年使用Vim后发生的情况。这不漂亮

说明:

本质上,我们在下一行中查找不重复的行,并对其执行操作,在本例中,添加一些文本

:%g/对与%s相同语法的模式执行操作 \非常神奇。使Vim正则表达式中的所有特殊字符都特殊。 .*\n后跟换行符的任何文本。捕获文本。 \zs开始在这里突出显示匹配。这将把光标放在匹配后的下一行,我们将在那里执行操作。 \1上面的捕获组。*,因此使用相同文本的新行。。。 @! 但要否定它!因此,光标将转到上一行未复制的任何行。 /规范A;100; 从正常模式命令A开始;100; 它将在每一行上执行击键,就像在正常模式下一样。这里是常规Vim,只需添加一个文本。
如果在更换之前线路都是相同的,这是一个非常糟糕的Vim解决方案:

/\v(.*)\n\zs\1@!
:%g//norm A;100;
传统上,在Vim中,您首先创建搜索,然后使用:%s//replace将上一次搜索替换为replace。一行是:

:%g/\v(.*)\n\zs\1@!/norm A;100;
我很抱歉。这就是多年使用Vim后发生的情况。这不漂亮

说明:

本质上,我们在下一行中查找不重复的行,并对其执行操作,在本例中,添加一些文本

:%g/对与%s相同语法的模式执行操作 \非常神奇。使Vim正则表达式中的所有特殊字符都特殊。 .*\n后跟换行符的任何文本。捕获文本。 \zs开始在这里突出显示匹配。这将把光标放在匹配后的下一行,我们将在那里执行操作。 \1上面的捕获组。*,因此使用相同文本的新行。。。 @! 但要否定它!因此,光标将转到上一行未复制的任何行。 /规范A;100; 从正常模式命令A开始;100; 它将在每一行上执行击键,就像在正常模式下一样。这里是常规Vim,只需添加一个文本。 还有一个

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

g/^/Global命令在每行上应用下一个表达式 如果行“”。-如果当前行的模数等于0,则为1%6 s/$/;100; 替换以结尾的行;100; 还有一个

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

g/^/Global命令在每行上应用下一个表达式 如果行“”。-如果当前行的模数等于0,则为1%6 s/$/;100; 替换以结尾的行;100;
只需写一个简单的脚本…{…count+=6;}…只需写一个简单的脚本…{…count+=6;}…感谢您的if!行“.”-1%6,不知道全局命令可以这样做!谢谢你的邀请!行“.”-1%6,不知道全局命令可以这样做!