文章目錄
- S06L23 Search, Find, and Replace - Part Two
- 1 文本替換命令 `:s/old/new/`
- 2 指定范圍的文本替換
- 3 特例:路徑的替換
- 4 文件行號的配置
- 5 要點總結
- (1)搜索當前行(Same Line Searching)
- (2)跨行搜索(Searching)
- (3)替換命令(Substitute Command)
寫在前面
根據李笑來《自學是門手藝》的建議,梳理完知識要點后又對這章內容制作了 Xmind 思維導圖,果然發現很多遺漏和生疏的細節。其實自學的很多訣竅都是老生常談,觀點普遍到幾乎沒人真正重視:預習、專注學習、復習、總結、學以致用……我們總以為看到的 99% 就是自學者的真實畫像了,卻往往忽略了重要性和比例(至少在自學這個問題上)并沒有正相關的聯系,所以才對這樣的老生常談不屑一顧。建議對 Vim 感興趣的朋友也親自整理一下思維導圖,相信一定會有驚喜。
S06L23 Search, Find, and Replace - Part Two
本課同步練習文件:vimclass/searching.txt
。
1 文本替換命令 :s/old/new/
這里的 s
就是 substitute
的首字母,表示 “替換”。
例如,將下列文本行中的 net
替換為 org
:
DOMAIN=example.net # The example.net doma in.
可以使用如下命令::s/net/org/
注意:末尾還有一個 /;并且該寫法只能替換匹配的 第一個關鍵詞。
若要實現全局替換,需加全局標記 g
,語法為::s/old/new/[flags]
,本例即為 :s/net/org/g
2 指定范圍的文本替換
語法::[range]s/old/new/[flags]
,默認范圍為 當前行。
其中,[range]
范圍有不同的寫法:
- 具體行號。例如,將第 1 行的
is
替換為isn't
,使用命令::1s/is/isn't/
。 - 具體行號范圍。例如,將 1 ~ 5 行中的
for
全部替換為FOR
::1,5s/for/FOR/
。 - 使用特殊行號標識:
.
表示當前行,$
表示最后一行。例如,從當前行到最后一行執行替換,[range]
部分寫作:.,$
。 - 用
%
表示所有行(即整個文件)。例如,將當前文件中的所有net
替換為org
,寫作::%s/net/org/g
。 - 范圍的正則表示:
[range]
部分語法為/pattern-1/,/pattern-2/
。例如,從包含Global
的行開始,到包含Local
的行結束,將net
統一替換為org
::/Global/,/Local/s/net/org/g
。 - 也可以將
/pattern/
和普通、特殊行號一起使用。例如,將net
全部替換為org
,指定范圍從Local
開始、并到當前文件末尾結束,可以寫作::/Local/,$s/net/org/g
。
3 特例:路徑的替換
特殊情況下,如果需要用 :s/old/new/
命令對 路徑內容 進行替換,例如將 MAIL_PATH=/var/spool/mail
替換為 MAIL_PATH=/usr/local/mail
。此時由于路徑分隔符和 :s
命令的分隔符相同(如 Linux
、Unix
、MacOS
等環境下),實現這類替換有兩種方法:
- 常規方法:使用
\
進行轉義,寫作::s/\/var\/spool/\/usr\/local/
- 使用其他字符作
:s
命令的分隔符,例如改為#
,寫作::s#/var/spool#/usr/local#
。
第一種方法雖然簡單,但可讀性很差,也很容易出錯。第二種方式更加簡便靈活,因此強烈推薦使用第二種。除了用 #
分隔,還可以用管道符號 |
或者 :
進行分隔,只要是 單個的非數字、非字母字符(single non-alphanumberic character) 即可。
注意
其實
/var/spool
前面的/
可以不參與替換,這樣更簡便。但為了更好地演示自定義:s
命令的分隔符,還是決定保留下來以示區別。
4 文件行號的配置
本節反復提到文件行號的使用,是時候好好講講行號的配置了:
行號狀態 | 行號配置命令 |
---|---|
開啟行號 | :set nu |
關閉行號 | :set nonu |
查看當前狀態 | :set nu? |
切換行號開關 | :set nu! |
注意:nu
的全稱為 number
,上述命令也可以使用 number
替換 nu
。查看當前狀態時,若未啟用行號,Vim
狀態欄將顯示 nonumber
;已開啟行號則顯示 number
:
【圖 1:使用 :set nu? 命令顯示的不同 Vim 狀態對比情況】
5 要點總結
這是官方給的知識點梳理,感覺沒我自己整理的思維導圖細致(哈哈)
(1)搜索當前行(Same Line Searching)
f{char}
:Forward searchF{char}
:Reverse searcht{char}
:Forward till searchT{char}
:Reverse till search- ;:Repeat in the same direction
- ,:Repeat in the opposite direction
(2)跨行搜索(Searching)
/{pattern}
:Forward search?{pattern}
:Reverse searchn
:Repeat search in the same directionN
:Repeat search in the opposite direction- *:Forward search for word
- #:Reverse search for word
(3)替換命令(Substitute Command)
語法::[range]s/{pattern}/{string}/[flags]
例如在當前文件內實現全局替換::%s/{pattern}/{string}/g
此外,還可以在命令前添加數量詞 [count]
,或者與 motion
操作進行組合,實現更多靈活多變的替換效果。
最后,給出我自己歸納的 L22~L23 Vim
查找與替換的思維導圖:
【圖 2:Vim 查找與替換部分(L22 + L23】