vim技巧删除行首行末的空白字符删除空白行

7次阅读

共计 1978 个字符,预计需要花费 5 分钟才能阅读完成。

本篇文章介绍 vim 的一些使用技巧:

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

    • 删除只有一个换行符的空行
    • 删除包含空白字符的空白行,但不删除只有一个换行符的空行
    • 删除包含空白字符的空白行和只有一个换行符的空行

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

在 vim 中,可以使用 :%s/^\s\+// 命令删除行首的所有空白字符。这里说的“空白字符”指的是空格和 Tab 字符,不包括换行符。对该命令的各个参数具体说明如下:

  • :%s
    :s 是替换命令,可以替换字符串,其基本格式是 :s/from/to/,把 “from” 字符串替换成 “to” 字符串,可以用正则表达式来匹配特定模式。该命令默认对光标所在行生效,而 :%s 表示对整个文件都进行替换。
  • ^
    表示匹配行首,即从行首开始匹配。对这个例子来说,只匹配行首的空白字符,不会匹配单词中间的空白字符和行末的空白字符。
  • \s
    表示匹配一个空白字符,也就是空格或 Tab 字符。
  • \+
    表示匹配一个或连续多个跟在它前面的上一个字符,其实是正则表达式 + 元字符的转义写法。例如,a\+ 表示匹配 “a”, “aa”, “aaaaaa” 等等,\s\+ 就是匹配一个或多个空白字符,至少要有一个空白字符。
  • /^\s\+//
    表示要匹配的内容是行首开头的一个或多个空白字符,最后的两个 // 中间内容为空,即替换后的内容为空,相当于去掉了行首的所有空白字符。

也可以使用 :%s/^\s*// 命令来删除行首的所有空白字符,* 表示匹配零个或连续多个跟在它前面的上一个字符。这个命令会匹配到行首没有空格的情况,由于替换后的内容是空,没有影响。

注意:如果写成 :%s/^\s// 的形式,只会删除行首的第一个空格,而不能删除多个空格。写成 :%s/^\+\s// 的形式也是只能删除行首的第一个空格。

类似的,可以用 :%s/\s\+$// 命令来删除行末的所有空白字符,$ 表示匹配行末。也可以写成 :%s/\s*$// 的形式。

使用 :help :s 命令查看该命令的帮助说明,部分关键内容说明如下:

:[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 的含义如下:

s whitespace character: <Space> and <Tab>

使用 :help \+ 命令查看 \+ 的含义如下:

\+ 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*$ 模式来说,匹配零个空白字符的情况,就相当于 ^$ 模式,也就是匹配只有一个换行符的空行,所以这个命令可以删除只有一个换行符的空行。

正文完
 0