VIM替换命令大全
1.使用命令將C語(yǔ)言中的enum替換為JAVA常量:
g/^\s*$/d
g/^/s//public static final int/
let i=1000
g/,/ s//\='='.i.';'/ |let i=i+1
2.使用命令將C語(yǔ)言中的#define宏替換為JAVA常量:
%s/^#define [A-Z, 0-9, _]*\zs\s\ze/=/
g/#define/s//public static final int/
g/$/s//;/
vim中一些高級(jí)替換技巧
1.替換變量
在正規(guī)表達(dá)式中使用 \( 和 \) 符號(hào)括起正規(guī)表達(dá)式,即可在后面使用\1、\2等變量來(lái)訪(fǎng)問(wèn) \( 和 \) 中的內(nèi)容。
example:
·將 data1 data2 修改為 data2 data1
-----------------------------------
:s/\(\w\+\)\s\+\(\w\+\)/\2\t\1
-----------------------------------
·將 Doe, John 修改為 John Doe
-----------------------------------
:%s/\(\w\+\), \(\w\+\)/\2 \1/??
-----------------------------------
2.利用函數(shù)式替換
用法:
---------------------------
:s/替換字符串/\=函數(shù)式
---------------------------
說(shuō)明:
·函數(shù)式可以有多個(gè),返回值可以用字符串連接符.連接起來(lái),如line(".")返回匹配行號(hào)(:help line()? ),submatch(n)可以引用\1、\2的內(nèi)容,其中submatch(0)引用匹配的整個(gè)內(nèi)容;
·函數(shù)式也可以是字符串常量,用雙引號(hào)引起來(lái)。函數(shù)式也可以是任意表達(dá)式,需要用小括號(hào)引起來(lái),如(3+2*6);
·函數(shù)式還可以是寄存器中的內(nèi)容,通過(guò)"@寄存器名"訪(fǎng)問(wèn),如@a(不需要加引號(hào),但是還是需要用.來(lái)連接);
example:
·要將下列8行的data0依次變成data0~7(前面的數(shù)字是行號(hào))
double data0;
double data0;
double data0;
double data0;
double data0;
double data0;
double data0;
double data0;
如果安裝有perl的話(huà),我以前一般都是借助perl來(lái)完成這件事情:
---------------------------------------------------------------------------
:r !perl -n -le "if(s/^(double\s+data)\d;/$1$k;/){ $k++; print $_; }" %:p---------------------------------------------------------------------------
其中%:p表示包含完整路徑的文件名
現(xiàn)在只用vim我們就可以完成這樣的事情:
首先將光標(biāo)移到125行(line(".")返回當(dāng)前匹配行的行號(hào),line("'a")返回mark a的行號(hào)):
---------------------------------------------------------------------------
ma
:%s/^\(double\s\+data\)\d\(;\)/\=submatch(1).(line(".")-line("'a")+1).submatch(2)/g
---------------------------------------------------------------------------
再或者
首先將光標(biāo)移到125行(line("'V7j
:%s/^\(double\s\+data\)\d\(;\)/\=submatch(1).(line(".")-line("'
---------------------------------------------------------------------------
3.匹配的開(kāi)始與結(jié)束
\zs和\ze可以用于替換操作中指明替換的開(kāi)始與結(jié)束,如上例中可以以更短的操作來(lái)實(shí)現(xiàn):
---------------------------------------------------------------------------
ma
:%s#^double\s\+data\zs\d\ze#\=(line(".")-line("'a")+1)#g
---------------------------------------------------------------------------
另外,還可以使用vim表達(dá)式來(lái)實(shí)現(xiàn)上述功能:
---------------------------------------------------------------------------
:let n=0 | g/^double\s\+data\zs\d/s//\=n/ | let n+=1
---------------------------------------------------------------------------
其中 ·|????? 用來(lái)分割不用的命令;
·g????? 在匹配后面模式的行中執(zhí)行指定的ex命令
·\zs??? 指明匹配由此開(kāi)始
·s//\=n 對(duì)匹配模式進(jìn)行替換,匹配模式為空,表示以上一次匹配成功的模式,
并且指明替換是一個(gè)表達(dá)式;
4. 高級(jí)遞增替換
把下面幾句放到 _vimrc
-------------------------------
let g:I=0
function! INC(increment)
let g:I =g:I + a:increment
return g:I
endfunction
------------------------------
·對(duì)于上述問(wèn)題,可以這樣解決:
-----------------------------------------------------
:let I=-1 | %s/^ double\s\+data\zs\d\ze/\=INC(1)/
-----------------------------------------------------
·還可以生成數(shù)字序列,如生成1~100間隔為5的數(shù)字序列:
--------------------------------------
:let I=0 | ‘a(chǎn),’b s/^/\=INC(5)/
--------------------------------------
總結(jié)
- 上一篇: __attribute__((packe
- 下一篇: 如何设置、查看以及调试core文件