[英]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中用一個命令就能做到嗎?
又一個
:g/^/ if !((line('.')-1)%6)|s/$/;100;
分解
g/^/
全局命令在每行上應用下一個表達式 if !((line('.')-1)%6)
如果當前行的模數等於0 s/$/;100;
替換以;100;
結尾的行 這取決於您“一個命令”的含義,但是您無需使用宏就可以為每個項目手動重復它:
qz
<shift-A>
;100;
<esc>
6j
q
3@z
因為向下跳6行是宏的一部分,所以它將正確對齊並在文件中循環。
此處的相關命令是q#
開始錄制宏, q
結束錄制,以及@#
播放錄制。
在更多地方可以找到更多信息,例如vim Wiki: http : //vim.wikia.com/wiki/Macros
如果在更改之前所有行都是相同的,這是一個非常討厭的Vim解決方案:
/\v(.*)\n\zs\1@!
:%g//norm A;100;
傳統上,在Vim中,您首先要進行搜索,然后使用:%s//replace
將上一次搜索:%s//replace
為“ replace”。 一行中將是:
:%g/\v(.*)\n\zs\1@!/norm A;100;
我很抱歉。 這是Vim使用多年后發生的情況。 不好看
說明:
本質上,我們要查找下一行中沒有重復的行,並對它們執行操作,在這種情況下,添加一些文本。
:%g/
對模式執行操作(語法與%s
相同) \\v
非常神奇。 使Vim正則表達式中的所有特殊字符變得特殊。 (.*)\\n
任何文本后跟換行符。 捕獲文本。 \\zs
在此處開始突出顯示比賽。 這會將光標放在比賽之后的下一行,我們將在其中執行操作。 \\1
來自(.*)
上方的捕獲組,因此換行時具有相同的文本... @!
但是,否定它! 因此,光標將轉到上一行沒有重復的任何行。 /norm A;100;
執行普通模式命令A;100;
它將像在普通模式下一樣在每一行上執行擊鍵。 這里是普通Vim,只需附加(A)文本即可。 :%s/\v(.*)(\n.*)(\n.*)(\n.*)(\n.*)(\n.*\n)/\1;100;\2\3\4\5\6/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.