一、基本模式
在命令模式下,可以實現快速替換文字,這在vim編輯過程中非常實用。基本的格式如下:
:[range]s/pattern/string/[c,e,g,i]
開頭的冒號表示進入到命令模式,下面的介紹為了方便會省略這個符號;
[range]表示替換的範圍,以行為單位,比如「1,4」為從第一行到第四行,起始行與末尾行以逗號間隔。如果省略range,則表示只替換當前行。s表示替換命令本身;
pattern表示將被查詢並替換的文字;
string是替換文字,它將取代pattern;
末尾的額外引數[c,e,g,i]:
c-confirm,表示每次替換前詢問(可以避免出現意外);e-error,表示忽略(不顯示)錯誤;g-globe,整行替換,如果沒有這個引數,那麼只會替換該行第乙個pattern;i-ignore,忽略大小寫區別。每次可選乙個或多個引數。
不同專案之間以/為分隔符;但是如果pattern或string本身包含了/的時候,就需要以#為分隔符;可是如果#也被包含在文字中的話,只好使用跳脫字元\。凡是在替換模式中有特殊功能的符號,都算是被徵用了,文字中使用這些符號的話,都需要用跳脫符號\以示區別。
1、全文替換: %s/sth/else/g ,%表示全部文字
2、只替換該行出現的第乙個sth為else: s/sth/else/
3、替換該行出現的所有sth為else: s/sth/else/g
4、替換從第n行到第m行所有的sth為else: n,ms/sth/else/g m和n的大小隨意
5、替換從當前行到末尾所有的sth為else: .,$s/sth/else/g 這裡的.表示當前行,$表示末尾行
6、刪除當前行所有的sth: s/sth//g 當string為空時,表示刪除對應的pattern
二、高階:正規表示式
還是從需求出發。
1、如果你想把a aa aaa aaaa aaaaa 等這種重複性的字元替換掉:
pattern應該這樣表示: a* 。* 號表示重複任意次它之前的那乙個字元,包括0次。
比如:ab*會匹配a ab abb abbb abbbb .....
所以如果星號前面只有乙個字元,pattern就會替換掉所有的空字元,包括空格、tab。
如果要避免出現匹配0次的情況,需要用 \+ 代替 *, \+ 表示匹配0次以上的任意次它之前的那乙個字元。
2、如果想替換 ab abab ababab ... 這一類的「整體」字串:
pattern可以這樣寫: \(ab\)* , 即把整體用括號括起來。但是括號本身需要用跳脫字元。
3、如果我只想替換 aaa aaaa aaaaa這三個即只重複了3-5次的a呢?我們可以指定重複次數。
pattern:a\ , 花括號裡面用乙個逗號分隔兩個數字,前者表示重複的下界,若省略則預設為0;後者表示重複的上界,省略則預設為無窮大。
如果省略逗號,即花括號裡面只有乙個數字,那就表示恰好只重複那麼多次。如 a\ 表示只匹配 aaaaa。
4、替換flag以及它的複數形式flags:
pattern:flags\= , \= 類似於邏輯符號「或」 ,即緊挨在它前面的那個字元可有可無。
5、替換{}裡面的所有內容://{}/
這個命令會搜尋一對花括號,而不管這裡面有沒有內容,有哪些內容,然後替換成{},即裡面什麼也沒有的一對花括號。在vim的替換模式裡,逗號「.」稱作萬用字元,即它代表任意的字元(注意,在命令列中萬用字元是*,但在vim替換中,星號表示的是重複),後面緊跟乙個*號,就可以表示任意字串。由於在搜尋的時候花括號本身也被替換了,所以在後面要補上。這是乙個很重要的技能,花括號本身是定位用的,我們並不想替換它,但是規則如此,所以補救方法是在string欄再補上乙個。
6、替換one、two、three其中的任意乙個或他們的任意排列組合
pattern:one\|two\|three . \| 才是vim替換裡面真正的「或」表示式。在此基礎上還有一種更**的組合:\(one\|two\|three\),我表示很凌亂,你們自己研究一下吧。。。
7、「與」表示式(還在研究)
8、篩選與範圍
1》替換a、e、f中的任意乙個,我們可能會想到利用「或」表示式,但是這種方式會濫殺無辜——因為ae、ef等排列組合也被誤殺了。。。vim提供了另外一種機制來滿足這種需求:[ ]
pattern: [aef] 你可以將要匹配的任意單個字元放在[ ]中,這就表示了篩選,只有中括號裡面的字元才會被匹配。裡面可以是任意字元,包括字母、數字、符號。。。需要注意的是,它一次只匹配單個字元,即不要以為中括號裡面字元的排列組合都會被智慧型匹配,[aef] 不會匹配ae神馬的。
2》如果要匹配任意乙個數字符號,就要醬:[0123456789] ,顯然這太麻煩了,我們可以醬:[0-9]。對所有字母可以醬:[a-za-z]。
中括號裡面的「-」表示了範圍這一概念,條件是,他們必須具有某種「序」,比如[3-6]會匹配3、4、5、6,但是不會匹配1、2、7、8、9、0,因為3-6是按數字的公升序排列的,對字母也是一樣。
3》補集,我想你們應該知道這個概念想要表達什麼,不知道請自行腦補集合論。。。
要替換一行裡除了f以外的所有字元,pattern可以醬:[^f]。 「^」表示了補集,但是這一概念只能在[ ]內使用。
9、預定義字符集
相當於定義了一堆快捷方式,比如用\d代替[0-9],表示所有數字符號,下面做個總結:
\d == [0-9] ; \d == [^0-9] ;
\x == [0-9a-fa-f] ; \x == [^0-9a-fa-f] ; (注:十六進製制字元)
\s == [ ]; \s == [^ ] ; (空白字元,空格和tab)
\a == [a-za-z] ; \a == [^a-za-z] ; (\a 我不確定,只是根據前面的規律猜測的,大家可以試一下)
\l == [a-z] ; \l == [^a-z] ;
\u == [a-z] ; \u == [^a-z] ;
需要注意的是,這些字符集和[ ]是並列或替代關係,即他們不能在[ ]內部使用。
10、斷行(明天再說。。)
VIM文字替換
使用了一年多的vim,文字替換還是有點模糊不清 提公升vim的工作效率,從攻克複雜難題開始 1.替換當前行中的內容 s from to s即substitude s from to 將當前行中的第乙個from,替換成to。如果當前行含有多個 from,則只會替換其中的第乙個。s from to g ...
VIM文字替換命令
在vim中進行文字替換 1.替換當前行中的內容 s from to s即substitude s from to 將當前行中的第乙個from,替換成to。如果當前行含有多個 from,則只會替換其中的第乙個。s from to g 將當前行中的所有from都替換成to。s from to gc 將當...
VIM文字替換命令
在vim中進行文字替換 1.替換當前行中的內容 s from to s即substitude s from to 將當前行中的第乙個from,替換成to。如果當前行含有多個 from,則只會替換其中的第乙個。s from to g 將當前行中的所有from都替換成to。s from to gc 將當...