例如,我们有一个包含各种域名的文件,大约有 800 行。我们想使用 vim 快速查找所有以 www.example.** 开头的域名,其中 ** 是任何类型的 2 个字母。
example.site"
example.link]"
example.example'
example.ex'
example.xx]"'
现在我们可以在 vim 中使用 term 进行搜索example.
,但是我们如何使用通配符来匹配,以便我们可以 example.ex' and example.xx]"
在上面的示例中找到?
我们不想像这样突出显示字符串
> example.site"
> example.link]"
> example.example'
只是example.ex and example.xx
(如果我们可以删除所有其他字符串并保留唯一匹配的字符串,那就更好了)
答案1
你可以使用:
/example\.\w\w\W
搜索“示例”。后跟两个“单词字符” \w
,然后是“非单词字符”\W
要删除与模式不匹配的所有行,您可以执行以下操作:
:v/example\.\w\w\W/delete
要不就:
:v/example\.\w\w\W/d
或者使用带否定的 g[lobal] 命令!
:
:g!/example\.\w\w\W/d
上述 3 个命令都会变成这样:
example.site"
example.link]"
example.example'
example.ex'
example.xx]"'
进入这个:
example.ex'
example.xx]"'
更新
为了处理这些模式位于同一行的情况,如下所示:
example.site"
example.example' example.ex' example.link]"
example.xx]"'
您可以使用如下搜索模式:
/example\.\w\w\w[^ ]* \?
其工作原理是找到“例子”。后跟三个“单词字符”,后跟任意数量的字符不是空格[^ ]*
并以可选空格结尾\?
。
因此,您可以将匹配项替换为空(这g
意味着将替换应用于该行中的每个匹配项,而不仅仅是它找到的第一个匹配项):
:%s/example\.\w\w\w[^ ]* \?//g
要得到:
example.ex'
example.xx]"'
(您还可以使用 删除空行:g/^$/d
。事实上,您可以使用 将其链接在一起|
并使用 完成所有操作:%s/example\.\w\w\w[^ ]* \?//g | %g/^$/d
)