如何在 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" 是什么意思,但是您可以使用宏而无需为每个项目手动重复它:
- 将光标放在第一行
- 开始录制名为 z 的宏:
qz
- 在行尾进入插入模式:
<shift-A>
- 输入你想要的文字:
;100;
- 退出插入模式:
<esc>
- 往下跳六行:
6j
- 停止录制宏:
q
- 重复正确次数的宏:
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;
结尾的行
我有一个包含这些行的文件:
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" 是什么意思,但是您可以使用宏而无需为每个项目手动重复它:
- 将光标放在第一行
- 开始录制名为 z 的宏:
qz
- 在行尾进入插入模式:
<shift-A>
- 输入你想要的文字:
;100;
- 退出插入模式:
<esc>
- 往下跳六行:
6j
- 停止录制宏:
q
- 重复正确次数的宏:
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)
如果当前行的模数等于0s/$/;100;
替换以;100;
结尾的行