標籤:

Vim 文本操作總結備忘

在學習和科研工作中,我使用Vim比較多,而且常常遇到處理文本的情況,比如刪除文本中的空行,每行前面增加行號等等這些需求。我一般是直接取Google搜索,但是有的時候也不一定能快速地搜索到,所以這裡我把常用到的需求和對應的Vim下的解決方法列出來,自己查起來方便些,也希望能幫助到別人。

下面我按每個需求來寫,每條記錄中,先是需求的介紹,然後是一個具體的例子,最後是解決方式。默認的解決方式是在Vim中的命令行模式下,按後再敲入命令。

1. 刪除Vim中的空行

如下面的文本:

abbcd

操作後空行被刪去,變成下面這樣:

abbcd

解決方案:

:g/^$/d # 刪除空白行,但是不刪去包含withspace的行:g/^s*$/d # 刪除空白行,包括刪去包含withspace的行

參考鏈接:stackoverflow.com/quest

2. 每行前面加行號

如原來文本如下:

abbc

則操作後變成:

1 a2 b3 b4 c

解決方案:

:%s/^/=printf(%d , line(.))

注意%d後面的空格,如果是要用點號.分割行號和內容的話,則將%d改成%d.即可。

3. 重複每行中的某個部分

例如原來文本為:

name1/path1 name2/path2name3/path3

想要變成如下內容:

name1/path1 path1name2/path2 path2name3/path3 path3

即重複path部分。

解決方案:

這裡的解決方法是找到需要重複的部分的特有的模式,通過正則表達式來匹配上,然後通過增加括弧來引用。這個例子中,需要重複的部分的特徵是前面有個/,所以可以通過匹配這個/來找到需要重複的部分。需要注意的是,/都需要進行轉意,即在前面增加

:0,$s//(.+)//1 1/g

4. 在第i行最後插入數字i

原來文本:

useruseruseruser

期望的結果是:

user1user2user3user4

解決方案:

:0,$s/$/=prinf(%d, line(.))

5. 對每行的數字進行特定的加減乘除操作

例如原先文本是這樣:

wang 23zhang 100zhao 33

希望對每行的數字都加10,即最終的結果是:

wang 33zhang 110zhao 43

解決方案:

:%s/d+/=submatch(0)+10

如果要進行減或者乘,則將上述命令中的最後面的加號改成減號和乘號即可,對於除法,直接改乘除號不行,這裡就只能通過乘以它的倒數來實現。

參考:vim.1045645.n5.nabble.com

6. 生成與行號又特定關係的文本

例如要生成下面的文件:

1 test1_name1 1002 test2_name2 2003 test3_name3 3004 test4_name4 400

解決方案:

:put=map(range(1,4), printf("%d test%d_name%d %d00",v:val,v:val,v:val,v:val))

參考: vim.wikia.com/wiki/Maki

7. 利用put函數生成等規律序列

例如想要生成如下序列:

PB11210245PB11210246PB11210247PB11210248PB11210249PB11210250PB11210251PB11210252PB11210253PB11210254PB11210255

解決方案:

:for i in range(245,255) | put=PB11210.i |endfor

8. 只替換一行中的特定序號的匹配項

例如原來文本是這樣:

a a a a a

替換奇數項為b,變成這樣:

a b a b a

解決方案:

:call feedkeys("nynyn") | s/a/b/gc

參考:unix.stackexchange.com/


推薦閱讀:

如何選購 Vim 腳踏板?
vim怎麼脫離滑鼠?
打造Python開發工具——vim+zsh+tmux
Vim 新人學習路線, 小技巧

TAG:Linux | Vim |