如何从 vim 中删除文本

如何从 vim 中删除文本

我想删除所有以 abc 结尾的单词

例子:

111abc 222def 333abc 444def 555abc 666def

从这里我想删除所有以 abc 结尾的单词。

所以我尝试了这个

:s/abc//g

但这只会替换 abc

如何删除所有以 abc 结尾的单词?

答案1

如果您想删除整个单词,并且您的样本是完整的,那么您需要使用这个正则表达式:

:s/[0-9]\{3\}abc//g

它会删除由 3 位数字后跟 组成的每一位abc

答案2

如果要删除的所有单词都由三个数字后跟字符序列“abc”组成,则可以采用@m4673r 的建议。对于更通用的方法,我建议这样做:

:s/\<\S*abc\>//g

这将删除以字符序列“abc”(111abc以及FOOBARabc或只是abc)结尾的任何单词(无论字符/长度)。

答案3

安斯加的答案很正确。
我将解释其各个部分,使它成为一种方法论而不是一个配方,因为我认为正则表达式在某种程度上是神秘的。

:s/\<\S*abc\>//g

是 vim 替换命令。
它的意思是“在当前行(使用 %s 表示全部行)用最后两个“/”之间的文本替换正则表达式的匹配项\<\S*abc\>(由前两个“/”分隔)。结尾的“g”代表全局,意味着替换所有匹配项,而不仅仅是第一个匹配项。

正则表达式括在转义的尖括号\<和中\>。这些是单词边界,这意味着正则表达式将只匹配单个单词内的文本。认为 vim 会在尝试匹配每个单词之前将文本拆分为单词。
转义的大写 S 表示非空白。\s(小写)匹配空白(空格和制表符),而\S(大写)匹配所有其他字符。
因此,\S*表示“非空白字符零次或多次”。
abc部分仅匹配该精确的字符序列。

综上所述,该正则表达式匹配由任何字符序列后跟 组成的整个单词abc,如下所示最大限度通缉。

由于 vim 对单词的理解方式,任意字符序列不会包含空格和其他作为单词边界的字符。其他角色列表取决于正在编辑的文件类型,输入 即可看到:set iskeyword enter。这是用于将文本拆分为单词的信息。

相关内容