Vim:用无行替换一行模式

7
我正在尝试在vim上实现简单的替换,但是做不对。我需要删除整个文件中与模式匹配的所有行。该模式为“something*”,意思是“something”后跟任何字符直到行末。
我尝试过:%s/pattern*\n//g:%s/pattern*$//g,但都没有成功。
有什么想法吗?
干杯!

2
FYI:*适用于模式中的前一个字符,因此在您的情况下,它将匹配零个或多个n。 - Brian Rasmussen
对,我总是被 shell 扩展字符搞混 :/ - brafales
2个回答

6
使用:g代替:substitute
:g/pattern/d

将删除所有与模式匹配的行。

至于模式,您的模式将匹配 patterpatternpatternn 等等。使用通配符 . 来匹配任何字符。因此,您的正则表达式应该是 pattern.*$ --- 但如果您希望完全删除这些行,则 :g/pattern/d 就可以很好地完成任务。


谢谢,正是我想要的,得习惯多看手册!;) - brafales
@brafales,是的。:gex 魔法的另一半。 :) 它是一个真正的隐藏强大工具,可以做出有趣的技巧。 - mike3996
2
一个补充:g/pattern/d _(注意下划线)的作用与s/.*pattern.*\n\=//g完全相同,而您的版本将破坏未命名、编号(1-9)和可能一些其他寄存器中的值。 - ZyX

0

根据您使用的vim版本,您可能会遇到我要提出的问题:

:%s/pattern.*^V^M//g

对于^V,直接按下ctrl-v,然后再按ENTER(^M)键。 ^V可以让你输入一个字面上的字符而不被解释。


点号表示“除换行符以外的任何符号”,因此不需要使用这样的集合。 - ZyX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接