vim技巧:刪除行首、行末的空白字符,刪除空白行

本篇文章介紹 vim 的一些使用技巧:正則表達式

  • 刪除行首、行末的空白字符(空格和Tab字符)
  • 刪除空白行vim

    • 刪除只有一個換行符的空行
    • 刪除包含空白字符的空白行,但不刪除只有一個換行符的空行
    • 刪除包含空白字符的空白行和只有一個換行符的空行

刪除行首、行末的空白字符 (空格和Tab字符)

在 vim 中,能夠使用 :%s/^\s\+// 命令刪除行首的全部空白字符。這裏說的 「空白字符」 指的是空格和Tab字符,不包括換行符。對該命令的各個參數具體說明以下:atom

  • :%s
    :s 是替換命令,能夠替換字符串,其基本格式是 :s/from/to/,把 "from" 字符串替換成 "to" 字符串,能夠用正則表達式來匹配特定模式。該命令默認對光標所在行生效,而 :%s 表示對整個文件都進行替換。
  • ^
    表示匹配行首,即從行首開始匹配。對這個例子來講,只匹配行首的空白字符,不會匹配單詞中間的空白字符和行末的空白字符。
  • \s
    表示匹配一個空白字符,也就是空格或Tab字符。
  • \+
    表示匹配一個或連續多個跟在它前面的上一個字符,實際上是正則表達式+元字符的轉義寫法。例如,a\+ 表示匹配 "a", "aa", "aaaaaa" 等等,\s\+ 就是匹配一個或多個空白字符,至少要有一個空白字符。
  • /^\s\+//
    表示要匹配的內容是行首開頭的一個或多個空白字符,最後的兩個//中間內容爲空,即替換後的內容爲空,至關於去掉了行首的全部空白字符。

也能夠使用 :%s/^\s*// 命令來刪除行首的全部空白字符,* 表示匹配零個或連續多個跟在它前面的上一個字符。這個命令會匹配到行首沒有空格的狀況,因爲替換後的內容是空,沒有影響。spa

注意:若是寫成 :%s/^\s// 的形式,只會刪除行首的第一個空格,而不能刪除多個空格。 寫成 :%s/^\+\s// 的形式也是隻能刪除行首的第一個空格。code

相似的,能夠用 :%s/\s\+$// 命令來刪除行末的全部空白字符,$ 表示匹配行末。也能夠寫成 :%s/\s*$// 的形式。字符串

使用 :help :s 命令查看該命令的幫助說明,部分關鍵內容說明以下:string

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]
For each line in [range] replace a match of {pattern} with {string}.
When [range] and [count] are omitted, replace in the current line only.

使用 :help \s 命令查看 \s 的含義以下:it

s whitespace character: <Space> and <Tab>

使用 :help \+ 命令查看 \+ 的含義以下:class

\+ Matches 1 or more of the preceding atom, as many as possible.

使用 :help /* 命令查看在模式匹配中 * 的含義以下:技巧

* (use \* when 'magic' is not set)
Matches 0 or more of the preceding atom, as many as possible.

刪除空白行

空白行指的是看起來沒有內容的行,但實際上可能會有空格、Tab字符,或者行末的換行符。針對下面幾種狀況,須要用不一樣的命令來刪除空白行:

  • 刪除只有一個換行符的空行
  • 刪除包含空白字符的空白行,但不刪除只有一個換行符的空行
  • 刪除包含空白字符的空白行和只有一個換行符的空行

刪除只有一個換行符的空行

在 vim 中,能夠使用 :%g/^$/d 命令來刪除只有一個換行符的空行。這裏的 ^ 表示匹配行首,$ 表示匹配行末,在行首和行末之間沒有任何字符,也就是空行。嚴格來講,這裏說的「行末」指的是最後一個換行符前面的一個字符,不包括換行符自身。「空行」 實際上仍是包含有一個換行符。

假設文件中有以下的內容:

abcd

efg

hijk

lmn


opqrst

那麼執行 :%g/^$/d 命令後的內容以下:

abcd
efg
hijk
lmn
opqrst

能夠看到,中間的空行都被刪除了。

刪除包含空白字符的空白行,但不刪除只有一個換行符的空行

有一些空白行看起來沒有內容,但可能會包含空格、Tab字符等空白字符,這些行用 :%g/^$/d 命令沒法刪除,^$ 匹配不到包含空白字符的狀況。

能夠用 :%g/^\s\+$/d 命令來刪除這些空白行,但不刪除只有一個換行符的空行。

這裏的 \s 表示匹配一個空白字符,\+ 表示匹配一個或連續多個跟在它前面的上一個字符,\s\+ 至少匹配一個空白字符,換行符不屬於空白字符,因此不匹配只有一個換行符的狀況。

刪除包含空白字符的空白行和只有一個換行符的空行

能夠使用 :%g/^\s*$/d 命令來同時刪除包含空白字符的空白行和只有一個換行符的空行。

這裏的 * 表示匹配零個或連續多個跟在它前面的上一個字符。對 ^\s*$ 模式來講,匹配零個空白字符的狀況,就至關於 ^$ 模式,也就是匹配只有一個換行符的空行,因此這個命令能夠刪除只有一個換行符的空行。

相關文章
相關標籤/搜索