我有一个包含这些行的文件:
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?
答案 0 :(得分:6)
还有一个
:g/^/ if !((line('.')-1)%6)|s/$/;100;
<强>击穿强>
g/^/
在每行应用下一个表达式的全局命令if !((line('.')-1)%6)
如果当前行的模数等于0 s/$/;100;
替换以;100;
答案 1 :(得分:4)
这取决于你对“一个命令”的意思,但你可以不使用宏为每个项目手动重复它:
qz
<shift-A>
;100;
<esc>
6j
q
3@z
因为跳下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/