substitute 替代字串命令
分類
說明
本篇主要介紹 :substitute
的功能,還有使用方式,因為知識量太龐大,所以我特別用一篇文章來寫這個指令的使用方式。
替代命令
:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]
對 [range]
指定的行把 {pattern}
的匹配替代成 {string}
。
如果 {pattern}
為空,使用上次使用的搜尋模式,而不是上一次的 substitute 或者 :global
所使用的模式。
上次使用的搜尋模式範例
:s/blue/red/
/green
:s//red/
此時 :s//red/
等同於 :s/green/red/
。
:[range]s[ubstitute] [flags] [count]
:[range]&[&][flags] [count]
使用最後一次 :substitute
相同的模式和替代字串,但不包括相同的標誌位。
若只輸入 :s
等同於輸入 :s//~/
,意思是重複上一次替代。
幫助文件 :help :&
。
:[range]~[&][flags] [count]
使用最後一次 :substitute
相同的替代字串,但使用最近使用的搜尋模式作為匹配模式。
範例
:s/one/two/
/three
:~
此時 :~
等同於 :s/three/two/
。
幫助文件 :help :~
。
&
同 :s
(重複上次的 substitute)。
幫助文件 :help &
。
Pattern
關於 Pattern 請參考 Vim Pattern 特殊字元
String
替代的字串,就是 {string}
的部分。
特殊字元
字元 | 動作 |
---|---|
& | 替代為完整的匹配 |
\& | 替代為 & |
\0 | 替代為完整的匹配 |
\1 | 替代為配對的第一個 () 裡面的內容 |
\2 | 替代為配對的第二個 () 裡面的內容 |
.. | .. |
\9 | 替代為配對的第九個 () 裡面的內容 |
~ | 替代為前一個 substitute 的替代字串 |
\~ | 替代為 ~ |
\u | 下一個字元成為大寫 |
\U | 其後字元變成大寫,直到 \E 出現 |
\l | 下一個字元成為小寫 |
\L | 其後字元變成小寫,直到 \E 出現 |
\e | 結束 \u、\U、\l 和 \L |
\E | 結束 \u、\U、\l 和 \L |
\\ | 插入單個反斜線 |
輸入 :help s~
查看完整文件。
替代為完整的匹配
意思是匹配的內容,這裡以 &
示範。
假設文本只有一行,我想將 abc 替代成 (abc),我可以輸入 :s/abc/(&)/
,此時 &
即為 abc 。
原文本
abc
輸入 :s/abc/(&)/
替代後文本
(abc)
替代為配對的第 n 個 ()
關於 \1 ~ \9 中第幾個 () 指的是 Pattern 裡面中第幾個 \( \)
括號。
原文本
ab
輸入 :s/\(a\)\(b\)/\2\1/
替代後文本
ba
替代為前一個 substitute 的替代字串
意思是用 ~
替代上次替代的內容,例如:上次將 a 替代成 b,這次將 c 替代成 ~
,此時 ~
為 b,範例如下。
原文本
1
2
輸入 :%s/1/a/
替代後文本
a
2
輸入 :%s/2/~/
替代後文本
a
a
\u 或 \l
一般使用此特殊字元意義不大,因為自己可以輸入想要的字母大小寫,用在配對的括號非常有幫助,如下範例所示。
原文本
Yes or No
輸入 :%s/\(Yes\) or \(No\)/\l\1 or \l\2/
替代後文本
yes or no
另外你可以使用 \E
阻止轉換大小寫 :%s/yes/\u\EyES/
。
\U 或 \L
使用方式類似 \u
或 \l
,但它會一直改變直到出現 \e
或 \E
,範例如下。
原文本
select *
輸入 :%s/\(select\) \*/\U\1\E Id, name/
替代後文本
SELECT Id, name
標誌 flag
[c] 確認每個替代。
替代過程,輸入以下指令決定該如何處理每次替代。
指令 | 說明 |
---|---|
a |
代這次和以後所有的匹配 |
l |
替代這次配對並退出 |
n |
跳過這次匹配 |
q |
退出替代過程 |
y |
替代這次匹配 |
CTRL-E |
上捲螢幕 |
CTRL-Y |
下捲螢幕 |
<Esc> |
退出替代過程 |
[g] 對行內所有的匹配進行替代。
[p] 顯示包含最後一次替代的行。
其他標誌可透過命令 :help s_flags
查看。
分隔符號
分隔符號不必非是 / 不可,除了用 / 來包圍模式和替代字串之外,你可以使用其它的單字節字元,用於 / 是搜尋模式或替代字串一部分的場合。例如: :s+/+//+
除了字母、數字、「\」、「”」或「|」之外,可用大部分的字元。Vim9 腳本裡也不能用「#」,因為它被識別為註解的開始。
範例
:s/private/public
將當前行第一個匹配 private 改成 public
:s/[Pp]rivate/\U& 100
將當前行至往下數第100行(例如: 1~100)的第一個匹配 private 或 Private 改成 PRIVATE
:1,100s/private/public/g
將第1~100所有匹配 private 改成 public
:%s/private/public/g
將文件所有匹配 private 改成 public
:%s/private/public/gc
將文件所有匹配 private 確認是否要改成 public
:%s/\([Pp]\)rivate/\1ublic/gc
將文件所有匹配 private 或 Private 確認是否要改成 public 或 Public
相關文章:
一杯咖啡的力量,勝過千言萬語的感謝。
支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!