vim 查找替換 和高級應用 vim的多行註釋和替換

vi/vim 中可使用 :s 命令來替換字符串html

:s/vivian/sky/ 替換當前行第一個 vivian 爲 skylinux

:s/vivian/sky/g 替換當前行全部 vivian 爲 skyshell

:n,$s/vivian/sky/ 替換第 n 行開始到最後一行中每一行的第一個 vivian 爲 skyvim

:n,$s/vivian/sky/g 替換第 n 行開始到最後一行中每一行全部 vivian 爲 skywindows

n 爲數字,若 n 爲 .,表示從當前行開始到最後一行ide

:%s/vivian/sky/(等同於 :g/vivian/s//sky/) 替換每一行的第一個 vivian 爲 sky工具

:%s/vivian/sky/g(等同於 :g/vivian/s//sky/g) 替換每一行中全部 vivian 爲 skypost

可使用 # 做爲分隔符,此時中間出現的 / 不會做爲分隔符ui

:s#vivian/#sky/# 替換當前行第一個 vivian/ 爲 sky/spa

:%s+/oradata/apras/+/user01/apras1+ (使用+ 來 替換 / ): /oradata/apras/替換成/user01/apras1/

1.

:s/vivian/sky/ 替換當前行第一個 vivian 爲 sky

:s/vivian/sky/g 替換當前行全部 vivian 爲 sky

2.

:n,$s/vivian/sky/ 替換第 n 行開始到最後一行中每一行的第一個 vivian 爲 sky

:n,$s/vivian/sky/g 替換第 n 行開始到最後一行中每一行全部 vivian 爲 sky

(n 爲數字,若 n 爲 .,表示從當前行開始到最後一行)

3.

:%s/vivian/sky/(等同於 :g/vivian/s//sky/) 替換每一行的第一個 vivian 爲 sky

:%s/vivian/sky/g(等同於 :g/vivian/s//sky/g) 替換每一行中全部 vivian 爲 sky

4.

可使用 # 做爲分隔符,此時中間出現的 / 不會做爲分隔符

:s#vivian/#sky/# 替換當前行第一個 vivian/ 爲 sky/

5.

刪除文本中的^M

問題描述:對於換行,window下用回車換行(0A0D)來表示,Linux下是回車(0A)來表示。這樣,將window上的文件拷到Unix上用時,總會有個^M.請寫個用在unix下的過濾windows文件的換行符(0D)的shell或c程序。

· 使用命令:cat filename1 | tr -d 「^V^M」 > newfile;

· 使用命令:sed -e 「s/^V^M//」 filename > outputfilename。須要注意的是在一、2兩種方法中,^V和^M指的是Ctrl+V和Ctrl+M。你必需要手工進行輸入,而不是粘貼。

· 在vi中處理:首先使用vi打開文件,而後按ESC鍵,接着輸入命令:%s/^V^M//。

· :%s/^M$//g

若是上述方法無用,則正確的解決辦法是:

· tr -d "\r" < src >dest

· tr -d "\015" dest

· strings A>B

6.

其它

利用 :s 命令能夠實現字符串的替換。具體的用法包括:

:s/str1/str2/ 用字符串 str2 替換行中首次出現的字符串 str1

:s/str1/str2/g 用字符串 str2 替換行中全部出現的字符串 str1

:.,$ s/str1/str2/g 用字符串 str2 替換正文當前行到末尾全部出現的字符串 str1

:1,$ s/str1/str2/g 用字符串 str2 替換正文中全部出現的字符串 str1

:g/str1/s//str2/g 功能同上

從上述替換命令能夠看到:g 放在命令末尾,表示對搜索字符串的每次出現進行替換;不加 g,表示只對搜索

字符串的首次出現進行替換;g 放在命令開頭,表示對正文中全部包含搜索字符串的行進行替換操做。

所有替換:

:%s/old-string/new-string/g

vi是unix和linux系統上最強大和最廣泛的文本編輯工具,通常而言,對於初次接觸vi的朋友,每每對它的字符替換不是很熟悉,下面作一個簡單的介紹:

對於字符替換,應該解決這樣幾個問題:

  • 用誰替換誰的問題;
  • 在那個範圍內進行查找和替換;
  • 是替換查找到的第一個仍是全部匹配的項所有替換;

vi命令的各類選項就提供了這樣的選擇按住esc鍵,進入命令狀態,而後按:,進入命令模式,開始輸入查找和替換命令, 通常形式以下:

  • ranges/source/target/g 解釋:range表示要搜索的範圍
  • "s"這個字母表示搜索的意思,這個是不能缺乏的.
  • source表示要搜索的字串.
  • target表示要進行替換的字串.
  • g表示對於符合條件的字串所有進行替換.

其中range的取值以下:

  • %表示所有的行;
  • .表示當前行;
  • $表示最後一行;
  • 能夠用具體的數字表示具體的行,如10,20等;

上述的標誌能夠進行組合:

如:

  • .,$s/source/target/g  表示從當前行到最後一行的搜索替換;
  • 又如10,20s/
  • 10,$s/等等組合;

 

vim的多行註釋和替換

之前學vim時是用的vim tutor,記得那裏面好像有關於多行註釋的教程,不過剛纔要用時發現本身之前學得一點都不紮實,除了最經常使用的一些命令外,其餘命令一律不記得,看來好記性確實不趕爛筆頭,仍是得記下來啊。。。

ctrl+v 進入列模式,向下或向上移動光標,把須要註釋的行的開頭標記起來,而後按大寫的I,再插入註釋符,好比#,再按Esc,就會所有註釋。或者也能夠運行下面這些命令:

:s/^/#                  #用"#"註釋當前行
:2,50s/^/#              #在2~50行首添加"#"註釋
:.,+3s/^/#              #用"#"註釋當前行和當前行後面的三行
:%s/^/#                 #用"#"註釋全部行

BTW:在替換時要注意,某些字符是須要轉譯的,如空格、括號等。

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中修改。(方式1 指令設定:
        :set ic(ignorecase 的縮寫) 忽略大小寫
        :set noic(noignorecase 的縮寫) 不忽略大小寫
        輸入了上述指令, 當每次的查找操做都會受到當前設定的影響)
      2. 大小寫智能匹配模式。輸入命令:set ignorecase smartcase能夠設置爲智能大小寫匹配模式。在這種模式下,若是你輸入的字符串中至少包含一個大寫字母,那麼就會以大小寫敏感模式進行搜索,不然以忽略大小寫模式進行搜索。
      3. 在搜索命令中指定大小寫。在幾種大小寫搜索模式中進行轉換總要輸入長長的一串指令,若是須要不斷地轉換模式,確實有些麻煩。因此你能夠直接在搜索命令中指定大小寫匹配模式。\c表示忽略大小寫,而\C表示對大小寫敏感。 例如:a: /\CWord 區分大小寫的查找     b:  /\cword 不區分大小寫的查找
    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向下滾屏,用來幫助查看先後內 容以決定進行操做。
 
 
 
參考:http://blog.chinaunix.net/uid-23933445-id-99691.html
相關文章
相關標籤/搜索