substitute 替代字串命令


建立時間: 2023年10月17日 08:53
更新時間: 2024年11月26日 09:06

說明

本篇主要介紹 :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

觀看次數: 746
:substitutesubstitutevim替代替換字串
按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

一杯咖啡的力量,勝過千言萬語的感謝。

支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!