Vim 文本操作總結備忘
- 2019 年 12 月 25 日
- 筆記
在學習和科研工作中,我使用Vim比較多,而且常常遇到處理文本的情況,比如刪除文本中的空行,每行前面增加行號等等這些需求。我一般是直接取Google搜索,但是有的時候也不一定能快速地搜索到,所以這裡我把常用到的需求和對應的Vim下的解決方法列出來,自己查起來方便些,也希望能幫助到別人。
下面我按每個需求來寫,每條記錄中,先是需求的介紹,然後是一個具體的例子,最後是解決方式。默認的解決方式是在Vim中的命令行模式下,按:
後再敲入命令。
1. 刪除Vim中的空行
如下面的文本:
a b b c d
操作後空行被刪去,變成下面這樣:
a b b c d
解決方案:
:g/^$/d # 刪除空白行,但是不刪去包含withspace的行 :g/^s*$/d # 刪除空白行,包括刪去包含withspace的行
參考鏈接:http://stackoverflow.com/questions/706076/vim-delete-blank-lines
2. 每行前面加行號
如原來文本如下:
a b b c
則操作後變成:
1 a 2 b 3 b 4 c
解決方案:
:%s/^/=printf('%d ', line('.'))
注意%d
後面的空格,如果是要用點號.
分割行號和內容的話,則將%d
改成%d.
即可。
3. 重複每行中的某個部分
例如原來文本為:
name1/path1 name2/path2 name3/path3
想要變成如下內容:
name1/path1 path1 name2/path2 path2 name3/path3 path3
即重複path部分。 解決方案: 這裡的解決方法是找到需要重複的部分的特有的模式,通過正則表達式來匹配上,然後通過增加括弧來引用。這個例子中,需要重複的部分的特徵是前面有個/
,所以可以通過匹配這個/
來找到需要重複的部分。需要注意的是,/
和(
,)
都需要進行轉意,即在前面增加。
:0,$s//(.+)//1 1/g
4. 在第i行最後插入數字i
原來文本:
user user user user
期望的結果是:
user1 user2 user3 user4
解決方案:
:0,$s/$/=prinf('%d', line('.'))
5. 對每行的數字進行特定的加減乘除操作
例如原先文本是這樣:
wang 23 zhang 100 zhao 33
希望對每行的數字都加10,即最終的結果是:
wang 33 zhang 110 zhao 43
解決方案:
:%s/d+/=submatch(0)+10
如果要進行減或者乘,則將上述命令中的最後面的加號改成減號和乘號即可,對於除法,直接改乘除號不行,這裡就只能通過乘以它的倒數來實現。 參考:http://vim.1045645.n5.nabble.com/Subtract-integer-value-from-column-td1184983.html
6. 生成與行號又特定關係的文本
例如要生成下面的文件:
1 test1_name1 100 2 test2_name2 200 3 test3_name3 300 4 test4_name4 400
解決方案:
:put=map(range(1,4), 'printf("%d test%d_name%d %d00",v:val,v:val,v:val,v:val)')
參考: http://vim.wikia.com/wiki/Making_a_list_of_numbers
7. 利用put函數生成等規律序列
例如想要生成如下序列:
PB11210245 PB11210246 PB11210247 PB11210248 PB11210249 PB11210250 PB11210251 PB11210252 PB11210253 PB11210254 PB11210255
解決方案:
: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
參考:http://unix.stackexchange.com/questions/27178/vim-s-replace-first-n-g-occurrences-on-a-line