簡體   English   中英

如何在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中用一個命令就能做到嗎?

又一個

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

分解

  • g/^/全局命令在每行上應用下一個表達式
  • if !((line('.')-1)%6)如果當前行的模數等於0
  • s/$/;100; 替換以;100;結尾的行

這取決於您“一個命令”的含義,但是您無需使用宏就可以為每個項目手動重復它:

  1. 將光標放在第一行
  2. 開始記錄名為z的宏: qz
  3. 在行的末尾輸入插入模式: <shift-A>
  4. 輸入所需的文本: ;100;
  5. 退出插入模式: <esc>
  6. 跳下六行: 6j
  7. 停止錄制宏: q
  8. 再次將宏重復正確的次數: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM