VIM中的搜尋和替換

2021-05-22 09:28:45 字數 3373 閱讀 7824

vim是被譽為非常高效的文字編輯軟體。但是掌握並高效的使用是件有難度的事情。在vim中進行快速的查詢和替換是提高vim使用效率的重要方法。下面是我在閱讀vim使用者手冊時整理的一些資料:

行內搜尋。

f命令可以進行行內搜尋。輸入fx可以找到下乙個x字元。

f命令可以在反方向進行行內搜尋,輸入fx可以找到上乙個x字元。

t命令同樣是進行行內搜尋,但是游標停留在符合條件的字元的前面。輸入tx使游標停留在下乙個x字元的前面。

t命令可以在反方向進行行內搜尋,但是游標停留在符合條件的字元的下乙個字元上。輸入tx使游標停留在上乙個x的後面的字元上。

%可以搜尋與之匹配的對應的(){}。這個功能對於書寫程式特別有用。

全文的搜尋。鍵入/後,游標進入vim底部的命令列,這時就可以輸入以/為開始的/搜尋命令了。

最簡單的查詢。輸入/string就可以查詢string字串。

對大小寫的匹配。

在命令列輸入:set ignorecase可以設定搜尋以忽略大小寫的方式進行。輸入:set noignorecase可以設定搜尋以匹配大小寫的方式進行。預設的,將匹配大小寫。這個預設設定可以在.vimrc中修改。

大小寫智慧型匹配模式。輸入命令:set ignorecase smartcase可以設定為智慧型大小寫匹配模式。在這種模式下,如果你輸入的字串中至少包含乙個大寫字母,那麼就會以大小寫敏感模式進行搜尋,否則以忽略大小寫模式進行搜尋。

在搜尋命令中指定大小寫。在幾種大小寫搜尋模式中進行轉換總要輸入長長的一串指令,如果需要不斷地轉換模式,確實有些麻煩。所以你可以直接在搜尋命令中指定大小寫匹配模式。/c表示忽略大小寫,而/c表示對大小寫敏感。

查詢當前詞。乙個簡單的方法可以讓你查詢下乙個和當前詞一樣的詞,你不比輸入/currentword,你可以直接按下*就可以查詢下乙個currentword。#可以讓你向上查詢同乙個單詞。

調整查詢後的游標位置。

使用/string/3會使在游標轉到找到string字串的行下面的第3行。第1行從包含string的行算起。同樣可以使用/string/-2來使游標停留在包含string的行的前面2行。

使用/string/e可以使游標停留在string字串的末尾而不是預設的第乙個字元位置。/string/b則表示停留在string第乙個字元的位置,不過預設就是如此,我們不比多此一舉。但是/string/b+2卻可以使游標停留在string字串的第二個字元的位置,這裡是r。在e或者b的後面+或者-數字,可以進一步調整游標的位置。

特殊字元。在搜尋命令中,  .*^%/?~$這10個字元有著特殊意義,所以在使用這些字元的時候要在前面加上乙個反斜槓/。而/e表示;/t表示;/r表示;/b表示。

匹配換行或空格。使用/n可以表示乙個換行;而/s表示匹配空白,注意是空白不是空格。/_s表示匹配換行或者空格;/_a表示匹配換行或者乙個字母。比如:/the/nword查詢以the結束並且下一行以word開始的行的位置。/the/_sword查詢the和word之間以空白或者換行分割的位置。/the/_s/+word表示the和word之間可以有多個空白。/+的含義可以在後面找到。

限定詞首或者詞尾。/《可以限定找到是以指定字串開始的單詞。比如//則是限定必須是以指定字串結尾的單詞。

行首和行尾。輸入/^string查詢以string開始的行,並且游標停留在這個string的第乙個字元。輸入/string$則查詢以string結束的行,並將游標停留在這個string的第乙個字元。這個模式不會忽略前導或者後置的空格。

匹配任何乙個字元。句號.可以匹配任何乙個字元。例如/t.e可以找到the或者tae或者tue。

更加複雜的匹配模式。實際上,/搜尋可以使用非常複雜的匹配模式。下面列出了其中一些複雜的匹配模式。

可重複的字元。

使用*表示它前面的字元可以重複多次或者0次。比如/be*可以匹配b,be,bee,beee等等。但是這也會包含b,因為e重複0後是空。如果要匹配諸如be,bebe,bebebe的字串可以使用/(和/)把他們包括起來,形如://(be/)*。

使用/+來限定為重複至少一次到無數次。如:/be/+可以匹配be,bee,bee等等。

重複0次或者一次。/=可以指定重複0次或者一次。/strings/=表示匹配string或者strings。這在查詢單詞的複數形式特別有用.

指定重複的次數。/可以指定重複n到m次。比如:/be/將會匹配bee,beee,beeee。同樣可以使用/表示匹配0到4次;/表示4次到無數次;/表示重複4次。

匹配列表中的乙個。使用乙個以/|分割的列表,可以表示匹配列表中任何一項。比如/one/|two表示查詢one或者two;/one/|two/|three表示查詢one或者two或者three。

乙個複雜的例項:/end/(if/|while/|for/)將會查詢endif,endwhile以及endfor。

字元列表。使用[0-9]可以表示乙個0到9範圍的字元。比如/string[1-5]表示查詢string1,string2,string3,string4,string5。當然也可以使用[a-z]表示字元a到z中間的乙個。

特殊的字元集合。使用/d也可以表示0到9的數字,這個選項可以代替[0-9]。/d表示非數字代替[^0-9];/x表示十六進製制數代替[0-9a-fa-f];/x表示非十六進製制數代替[^0-9a-fa-f];/s表示空白字元代替[ ] (和);/s表示非空白字元代替[^ ] (除和之外);/l表示小寫字母代替[a-z];/l表示非小寫字母代替[^a-z];/u表示大寫字母代替[a-z];/u表示非大寫字母代替[^a-z]

搜尋並替換。輸入:[range]s/from/to/[flags]命令可以搜尋匹配的字串並且替換為指定的字串。這是乙個稍微複雜的命令。其中[range]是乙個可選項,用來指定搜尋替換的範圍。[flags]也是乙個可選項,用來指定搜尋替換的處理方式。所以這個命令的簡單形式是:s/from/to/。

搜尋替換的範圍。如果沒有指定範圍,則只在當前行進行搜尋替換。

在所有行進行搜尋替換。範圍符號%表示在所有行進行搜尋替換。:%s/from/to/就是在全文查詢from並替換為to。

在指定的行上進行搜尋替換。:1,50s/from/to/表示在第1行和第50行之間(包括1和50行)進行搜尋和替換。:45s/from/to/表示僅僅在第45行進行搜尋和替換。而"1,$"行號範圍和「%「是等價的。

處理方式。我現在使用的vim預設的方式是無須確認。不過好像不同版本的預設的處理方式是不同的。

無須確認。方式符號g表示直接替換無須進行確認。:%s/from/to/g表示在全文中查詢from並且直接全部替換為to。

列印。處理方式符號p表示在替換時列出每個被改變的行。手冊中這麼說,但是實際效果卻讓我很迷惑。

確認後處理。處理方式符號c表示在進行替換前需要使用者進行確認。這時你可以選擇(y/n/a/q/1/^e/^y):y表示同意當前替換;n表示不同意當前替換;a表示替換當前和後面的並且不再確認;q表示立即結束替換操作;1表示把當前的替換後結束替換操作;^e向上滾屏^y向下滾屏,用來幫助檢視前後內容以決定進行操作。

vim搜尋和替換

進入可視模式 pattern 從游標開始處向檔案尾搜尋pattern pattern 從游標開始處向檔案首搜尋pattern n 在同一方向重複上一次搜尋命令 n 在反方向上重複上一次搜尋命令 s p1 p2 g 將當前行中所有p1均用p2替代 n1,n2s p1 p2 g 將第n1至n2行中所有p...

Vim高階技術 搜尋和替換

搜尋,分為二個部分 乙個是搜尋命令,另乙個是模式匹配 搜尋命令就是各個編輯器所支援的啟動搜尋的方式,比如windows的各種編輯器都是以對話方塊的形式。模式就是在對話方塊中輸入的要匹配的字串集。本身字串的匹配功能有限,所以就有了專門用於模式匹配的正規表示式,它描述了模式匹配的一些規則,使用這些規則可...

Vim高階技術 搜尋和替換

行內搜尋,也就是在當前行內進行搜尋和移動,通常都與編輯命令一起使用。搜尋,分為二個部分 乙個是搜尋命令,另乙個是模式匹配 搜尋命令就是各個編輯器所支援的啟動搜尋的方式,比如windows的各種編輯器都是以對話方塊的形式。模式就是在對話方塊中輸入的要匹配的字串集。本身字串的匹配功能有限,所以就有了專門...