仅删除vim中的单个尾随空格

时间:2020-09-28 01:00:34

标签: regex vim

保存Markdown文件时,我想删除行尾的单个尾随空格,并将两个或多个尾随空格修剪为两个。

我尝试过

:%s/\([^\s]\)\s$/\1/gc

但是仍然匹配两个尾随空格吗?修剪两个似乎可以:

:%s/\s\{2,}$/  /gc

我在这里想念什么?谢谢!

2 个答案:

答案 0 :(得分:2)

[]内,所有字符均按字面意义使用。因此,您实际上是在说“所有空白但都会匹配的\s字符。您想要的是\S(任何非空白字符)。

此外,您可以使其更简单。 Vim具有特殊的零宽度修饰符\zs\ze来分别设置比赛的起点或终点。因此,您可以执行以下操作:

:%s/\S\zs\s$//gc

细分:

  • %s/{pattern}//gc-用确认确认的空字符串替换整个文件中每次出现的{pattern}
  • \S-任何非空白字符
  • \zs-从此处开始比赛
  • \s-任何空格字符
  • $-行尾

请参阅以下:help主题:

:h :s
    :h :s_flags

:h pattern-atoms
    :h /[]
    :h /\zs
    :h /\ze
    :h /\$

答案 1 :(得分:2)

例如,

%s/\s\+$/\=strlen(submatch(0)) >= 2 ? '  ' : ''/e

也就是说,捕获行尾的所有空格,如果匹配长度大于2,则用两个空格代替。我相信这非常简单。另请参见:h sub-replace-expression

相关问题