VIM中的搜索和替換

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

  1. 行內搜索。
    1. f命令可以進行行內搜索。輸入fx可以找到下一個x字符。
    2. F命令可以在反方向進行行內搜索,輸入Fx可以找到上一個x字符。
    3. t命令同樣是進行行內搜索,但是光標停留在符合條件的字符的前面。輸入tx使光標停留在下一個x字符的前面。
    4. T命令可以在反方向進行行內搜索,但是光標停留在符合條件的字符的下一個字符上。輸入tx使光標停留在上一個x的後面的字符上。
    5. %可以搜索與之匹配的對應的()[]{}。這個功能對於書寫程序特別有用。
  2. 全文的搜索。鍵入/後,光標進入VIM底部的命令行,這時就可以輸入以/爲開始的/搜索命令了。
    1. 最簡單的查找。輸入/string就可以查找string字符串。
    2. 繼續查找。在第一次搜索後輸入n將會繼續進行上一次搜索,如果輸入3n那麼會找到後面第三個符合的字符串。大寫的N會在反方向,也就是向上進行搜索。
    3. 向上搜索。輸入?可以向上搜索。隨後的n命令將會繼續向上搜索,N向下搜索,其他和/一樣。
    4. 對大小寫的匹配。
      1. 在命令行輸入:set ignorecase可以設置搜索以忽略大小寫的方式進行。輸入:set noignorecase可以設置搜索以匹配大小寫的方式進行。默認的,將匹配大小寫。這個默認設置可以在.vimrc中修改。
      2. 大小寫智能匹配模式。輸入命令:set ignorecase smartcase可以設置爲智能大小寫匹配模式。在這種模式下,如果你輸入的字符串中至少包含一個大寫字母,那麼就會以大小寫敏感模式進行搜索,否則以忽略大小寫模式進行搜索。
      3. 在搜索命令中指定大小寫。在幾種大小寫搜索模式中進行轉換總要輸入長長的一串指令,如果需要不斷地轉換模式,確實有些麻煩。所以你可以直接在搜索命令中指定大小寫匹配模式。\c表示忽略大小寫,而\C表示對大小寫敏感。
    5. 查找當前詞。一個簡單的方法可以讓你查找下一個和當前詞一樣的詞,你不比輸入/currentword,你可以直接按下*就可以查找下一個currentword。#可以讓你向上查找同一個單詞。
    6. 調整查找後的光標位置。
      1. 使用/string/3會使在光標轉到找到string字符串的行下面的第3行。第1行從包含string的行算起。同樣可以使用/string/-2來使光標停留在包含string的行的前面2行。
      2. 使用/string/e可以使光標停留在string字符串的末尾而不是默認的第一個字符位置。/string/b則表示停留在string第一個字符的位置,不過默認就是如此,我們不比多此一舉。但是/string/b+2卻可以使光標停留在string字符串的第二個字符的位置,這裏是r。在e或者b的後面+或者-數字,可以進一步調整光標的位置。
    7. 特殊字符。在搜索命令中,  .*[]^%/?~$這10個字符有着特殊意義,所以在使用這些字符的時候要在前面加上一個反斜槓/。而\e表示<esc>;\t表示<tab>;\r表示<cr>;\b表示<bs>。
    8. 匹配換行或空格。使用\n可以表示一個換行;而\s表示匹配空白,注意是空白不是空格。\_s表示匹配換行或者空格;\_a表示匹配換行或者一個字母。比如:/the\nword查找以the結束並且下一行以word開始的行的位置。/the\_sword查找the和word之間以空白或者換行分割的位置。/the\_s\+word表示the和word之間可以有多個空白。\+的含義可以在後面找到。
    9. 限定詞首或者詞尾。\<可以限定找到是以指定字符串開始的單詞。比如/\<the可以找到以the開始在字符串,但是會忽略在單詞中間包含the的字符串。而\>則是限定必須是以指定字符串結尾的單詞。
    10. 行首和行尾。輸入/^string查找以string開始的行,並且光標停留在這個string的第一個字符。輸入/string$則查找以string結束的行,並將光標停留在這個string的第一個字符。這個模式不會忽略前導或者後置的空格。
    11. 匹配任何一個字符。句號.可以匹配任何一個字符。例如/t.e可以找到the或者tae或者tue。
  3. 更加複雜的匹配模式。實際上,/搜索可以使用非常複雜的匹配模式。下面列出了其中一些複雜的匹配模式。
    1. 可重複的字符。
      1. 使用*表示它前面的字符可以重複多次或者0次。比如/be*可以匹配b,be,bee,beee等等。但是這也會包含b,因爲e重複0後是空。如果要匹配諸如be,bebe,bebebe的字符串可以使用\(和\)把他們包括起來,形如:/\(be\)*。
      2. 使用\+來限定爲重複至少一次到無數次。如:/be\+可以匹配be,bee,bee等等。
      3. 重複0次或者一次。\=可以指定重複0次或者一次。/strings\=表示匹配string或者strings。這在查找單詞的複數形式特別有用.
      4. 指定重複的次數。\{n,m}可以指定重複n到m次。比如:/be\{2,4}將會匹配bee,beee,beeee。同樣可以使用\{,4}表示匹配0到4次;\{4,}表示4次到無數次;\{4}表示重複4次。
    2. 匹配列表中的一個。使用一個以\|分割的列表,可以表示匹配列表中任何一項。比如/one\|two表示查找one或者two;/one\|two\|three表示查找one或者two或者three。
      1. 一個複雜的實例:/end\(if\|while\|for\)將會查找endif,endwhile以及endfor。
      2. 字符列表。使用[0-9]可以表示一個0到9範圍的字符。比如/string[1-5]表示查找string1,string2,string3,string4,string5。當然也可以使用[a-z]表示字符a到z中間的一個。
      3. 特殊的字符集合。使用\d也可以表示0到9的數字,這個選項可以代替[0-9]。\D表示非數字代替[^0-9];\x表示十六進制數代替[0-9a-fA-F];\X表示非十六進制數代替[^0-9a-fA-F];\s表示空白字符代替[ ] (<Tab> 和<Space>);\S表示非空白字符代替[^ ] (除<Tab> 和<Space>之外);\l表示小寫字母代替[a-z];\L表示非小寫字母代替[^a-z];\u表示大寫字母代替[A-Z];\U表示非大寫字母代替[^A-Z]
  4. 搜索並替換。輸入:[range]s/from/to/[flags]命令可以搜索匹配的字符串並且替換爲指定的字符串。這是一個稍微複雜的命令。其中[range]是一個可選項,用來指定搜索替換的範圍。[flags]也是一個可選項,用來指定搜索替換的處理方式。所以這個命令的簡單形式是:s/from/to/。
    1. 搜索替換的範圍。如果沒有指定範圍,則只在當前行進行搜索替換。
      1. 在所有行進行搜索替換。範圍符號%表示在所有行進行搜索替換。:%s/from/to/就是在全文查找from並替換爲to。
      2. 在指定的行上進行搜索替換。:1,50s/from/to/表示在第1行和第50行之間(包括1和50行)進行搜索和替換。:45s/from/to/表示僅僅在第45行進行搜索和替換。而"1,$"行號範圍和“%“是等價的。
    2. 處理方式。我現在使用的VIM默認的方式是無須確認。不過好像不同版本的默認的處理方式是不同的。
      1. 無須確認。方式符號g表示直接替換無須進行確認。:%s/from/to/g表示在全文中查找from並且直接全部替換爲to。
      2. 列印。處理方式符號p表示在替換時列出每個被改變的行。手冊中這麼說,但是實際效果卻讓我很迷惑。
      3. 確認後處理。處理方式符號c表示在進行替換前需要用戶進行確認。這時你可以選擇(y/n/a/q/1/^E/^Y):y表示同意當前替換;n表示不同意當前替換;a表示替換當前和後面的並且不再確認;q表示立即結束替換操作;1表示把當前的替換後結束替換操作;^E向上滾屏^Y向下滾屏,用來幫助查看前後內容以決定進行操作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章