vim 替換的技巧

來源:互聯網
上載者:User

1.C語言中的enum轉JAVA常量:

g/^\s*$/d
g/^/s//public static final int/

let i=1000
g/,/ s//\='='.i.';'/ |let i=i+1

2.C語言中的#define宏轉JAVA常量:

%s/^#define [A-Z, 0-9, _]*\zs\s\ze/=/
g/#define/s//public static final int/
g/$/s//;/

 

 

vim中一些進階替換技巧

1.替換變數
在正規運算式中使用 \( 和 \) 符號括起正規運算式,即可在後面使用\1、\2等變數來訪問 \( 和 \) 中的內容。
example:
·將 data1 data2 修改為 data2 data1
-----------------------------------
:s/\(\w\+\)\s\+\(\w\+\)/\2\t\1
-----------------------------------
·將 Doe, John 修改為 John Doe
-----------------------------------
:%s/\(\w\+\), \(\w\+\)/\2 \1/   
-----------------------------------
2.利用函數式替換
用法:
---------------------------
:s/替換字串/\=函數式
---------------------------
說明:
·函數式可以有多個,傳回值可以用字串串連符.串連起來,如line(".")返回匹配行號(:help line()  ),submatch(n)可以引用\1、\2的內容,其中submatch(0)引用匹配的整個內容;
·函數式也可以是字串常量,用雙引號引起來。函數式也可以是任意運算式,需要用小括弧引起來,如(3+2*6);
·函數式還可以是寄存器中的內容,通過"@寄存器名"訪問,如@a(不需要加引號,但是還是需要用.來串連);
example:
·要將下列8行的data0依次變成data0~7(前面的數字是行號)
double data0;
double data0;
double data0;
double data0;
double data0;
double data0;
double data0;
double data0;
如果安裝有perl的話,我以前一般都是藉助perl來完成這件事情:
---------------------------------------------------------------------------
:r !perl -n -le "if(s/^(double\s+data)\d;/$1$k;/){ $k++; print $_; }" %:p---------------------------------------------------------------------------
其中%:p表示包含完整路徑的檔案名稱
現在只用vim我們就可以完成這樣的事情:
首先將游標移到125行(line(".")返回當前匹配行的行號,line("'a")返回mark a的行號):
---------------------------------------------------------------------------
ma
:%s/^\(double\s\+data\)\d\(;\)/\=submatch(1).(line(".")-line("'a")+1).submatch(2)/g
---------------------------------------------------------------------------
再或者
首先將游標移到125行(line("'V7j
:%s/^\(double\s\+data\)\d\(;\)/\=submatch(1).(line(".")-line("'
---------------------------------------------------------------------------
3.匹配的開始與結束
\zs和\ze可以用於替換操作中指明替換的開始與結束,如上例中可以以更短的操作來實現:
---------------------------------------------------------------------------
ma
:%s#^double\s\+data\zs\d\ze#\=(line(".")-line("'a")+1)#g
---------------------------------------------------------------------------
另外,還可以使用vim運算式來實現上述功能:
---------------------------------------------------------------------------
:let n=0 | g/^double\s\+data\zs\d/s//\=n/ | let n+=1
---------------------------------------------------------------------------
其中 ·|      用來分割不用的命令;
·g      在匹配後面模式的行中執行指定的ex命令
·\zs    指明匹配由此開始
·s//\=n 對匹配模式進行替換,匹配模式為空白,表示以上一次匹配成功的模式,
並且指明替換是一個運算式;
4. 進階遞增替換
把下面幾句放到 _vimrc
-------------------------------
let g:I=0
function! INC(increment)
let g:I =g:I + a:increment
return g:I
endfunction
------------------------------
·對於上述問題,可以這樣解決:
-----------------------------------------------------
:let I=-1 | %s/^ double\s\+data\zs\d\ze/\=INC(1)/
-----------------------------------------------------
·還可以產生數字序列,如產生1~100間隔為5的數字序列:
--------------------------------------
:let I=0 | ‘a,’b s/^/\=INC(5)/
--------------------------------------
http://hi.baidu.com/%C1%EE%BA%FC%D2%BB%B6%FE/blog/item/5ae257d82a7cb8e339012fc3.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.