![如何从 vim 中删除文本](https://linux22.com/image/1329713/%E5%A6%82%E4%BD%95%E4%BB%8E%20vim%20%E4%B8%AD%E5%88%A0%E9%99%A4%E6%96%87%E6%9C%AC.png)
我想删除所有以 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。这是用于将文本拆分为单词的信息。