linux中Vim尋找和替換的方法

來源:互聯網
上載者:User

總有人問我 Vim 中能不能尋找,當然能!而且是超級強的尋找! 這篇文章來詳細介紹 Vim 中尋找相關的設定和使用方法。 包括尋找與替換、尋找游標所在詞、高亮前景/背景色、切換高亮狀態、大小寫敏感尋找等。

尋找

在normal模式下按下/即可進入尋找模式,輸入要尋找的字串並按下斷行符號。 Vim會跳轉到第一個匹配。按下n尋找下一個,按下N尋找上一個。

Vim尋找支援Regex,例如/vim$匹配行尾的"vim"。 需要尋找特殊字元需要轉義,例如/vim\$匹配"vim$"。

注意尋找斷行符號應當用\n,而替換為斷行符號應當用\r(相當於<CR>)。
大小寫敏感尋找

在尋找模式中加入\c表示大小寫不敏感尋找,\C表示大小寫敏感尋找。例如:

/foo\c
將會尋找所有的"foo","FOO","Foo"等字串。

大小寫敏感配置

Vim 預設採用大小寫敏感的尋找,為了方便我們常常將其配置為大小寫不敏感:

" 設定預設進行大小寫不敏感尋找
set ignorecase
" 如果有一個大寫字母,則切換到大小寫敏感尋找
set smartcase
將上述設定粘貼到你的~/.vimrc,重新開啟Vim即可生效。
尋找當前單詞

在normal模式下按下*即可尋找游標所在單詞(word), 要求每次出現的前後為空白字元或標點符號。例如當前為foo, 可以匹配foo bar中的foo,但不可匹配foobar中的foo。 這在尋找函數名、變數名時非常有用。

按下g*即可尋找游標所在單詞的字元序列,每次出現前後字元無要求。 即foo bar和foobar中的foo均可被匹配到。

尋找與替換

:s(substitute)命令用來尋找和替換字串。文法如下:

:{作用範圍}s/{目標}/{替換}/{替換標誌}
例如:%s/foo/bar/g會在全域範圍(%)尋找foo並替換為bar,所有出現都會被替換(g)。

作用範圍

作用範圍分為當前行、全文、選區等等。

當前行:

:s/foo/bar/g
全文:

:%s/foo/bar/g
選區,在Visual模式下選擇地區後輸入:,Vim即可自動補全為 :'<,'>。

:'<,'>s/foo/bar/g
2-11行:

:5,12s/foo/bar/g
當前行.與接下來兩行+2:

:.,+2s/foo/bar/g
替換標誌

上文中命令結尾的g即是替換標誌之一,表示全域global替換(即替換目標的所有出現)。 還有很多其他有用的替換標誌:

空替換標誌表示只替換從游標位置開始,目標的第一次出現:

:%s/foo/bar
i表示大小寫不敏感尋找,I表示大小寫敏感:

:%s/foo/bar/i
# 等效於模式中的\c(不敏感)或\C(敏感)
:%s/foo\c/bar
c表示需要確認,例如全域尋找"foo"替換為"bar"並且需要確認:

:%s/foo/bar/gc
斷行符號後Vim會將游標移動到每一次"foo"出現的位置,並提示

replace with bar (y/n/a/q/l/^E/^Y)?
按下y表示替換,n表示不替換,a表示替換所有,q表示退出尋找模式, l表示替換當前位置並退出。^E與^Y是游標移動快速鍵,參考: Vim中如何快速進行游標移動。

高亮設定

醒目提示設定

如果你像我一樣覺得高亮的顏色不太舒服,也可以進行設定:

highlight Search ctermbg=grey ctermfg=black
將上述配置粘貼到~/.vimrc,重新開啟vim即可生效。
上述配置指定Search結果的前景色彩(foreground)為黑色,背景色(background)為灰色。 禁用/啟用高亮

有木有覺得每次尋找替換後Vim仍然高亮著搜尋結果? 可以手動讓它停止高亮,在normal模式下輸入:

:nohighlight
" 等效於
:nohl
其實上述命令禁用了所有高亮,正確的命令是:set nohlsearch。 下次搜尋時需要:set hlsearch再次啟動搜尋高亮。 怎麼能夠讓Vim尋找/替換後自動取消高亮,下次尋找時再自動開啟呢?

" 當游標一段時間保持不動了,就禁用高亮

autocmd cursorhold * set nohlsearch
" 當輸入尋找命令時,再啟用高亮

noremap n :set hlsearch<cr>n
noremap N :set hlsearch<cr>N
noremap / :set hlsearch<cr>/
noremap ? :set hlsearch<cr>?
noremap * *:set hlsearch<cr>

將上述配置粘貼到~/.vimrc,重新開啟vim即可生效。

 刪除文本中的^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.需要注意的是在1、2兩種方法中,^V和^M指的是Ctrl+V和Ctrl+M.你必須要手工進行輸入,而不是粘貼。
 
  。 在vi中處理:首先使用vi開啟檔案,然後按ESC鍵,接著輸入命令:%s/^V^M//.
 
  。 :%s/^M$//g
 
  如果上述方法無用,則正確的解決辦法是: [Page]
 
  。 tr -d \"\\r\" < src >dest
 
  。 tr -d \"\\015\" dest
 
  。 strings A>B
      6. 替換確認
         我們有很多時候會需要某個字元(串)在文章中某些位置出現時被替換,而其它位置不被替換的有選擇的操作,這就需要使用者來進行確認,vi的尋找替換同樣支援
       例如
      :s/vivian/sky/g 替換當前行所有 vivian 為 sky
      在命令後面加上一個字母c就可以實現,即:s/vivian/sky/gc
      顧名思意,c是confirm的縮寫
 
  7. 其它
 
  利用 :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 放在命令開頭,表示對本文中所有包含搜尋字串的行進行替換操作

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.