vim文字替換

2021-06-22 03:14:39 字數 3003 閱讀 8201

一、基本模式

在命令模式下,可以實現快速替換文字,這在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 將當...