使用vim正则表达式删除整行,如果它包含句点并且不包含某些字符

时间:2016-10-24 02:55:14

标签: regex vim

我正在使用vim,我想删除一个有句号的整行(。)但是没有以下字符:,ö,ä,ë

#!/usr/bin/env bash

dir = "."
for f in "$dir"/*; do
    cp -r  Source "$f"
done

下面是我正在使用的正则表达式语句。我正在使用替代声明,因为我想确认每次删除,但我愿意接受任何解决方案(即good. bad # gets deleted göod. # does not get deleted bäd. goëd # does not get deleted go:od. # does not get deleted )。

%g//d

2 个答案:

答案 0 :(得分:1)

这就像我能得到它一样简单。只是对一个fullstop的基本检查,并确保它之前和之后的所有内容(在该行上)不是alt字符。请注意,您可能需要将前导^$替换为\n,或者可能需要在命令行中添加另一个标记以使其在每行中找到它。

^[^:öäë]*\.[^:öäë]*$

或翻译用于VIM(对Sundeep的赞誉):

:g/^[^:öäë]*\.[^:öäë]*$/d

示例:https://regex101.com/r/98tOtz/4

答案 1 :(得分:1)

对于这个特殊情况,@ Addison的回答很好;如果积极匹配不像.那样微不足道,那么这是一个更通用的解决方案:

/^\%(.*[:öäë]\)\@!.*\./

这会在错误字符\@!之后的任何地方从行^的开头断言不匹配.*[:öäë],然后匹配(从头开始,因为断言没有消耗任何字符)文字句点.*\.

您可以在:global以及:substitute中使用此正则表达式:

:%s/^\%(.*[:öäë]\)\@!.*\..*\n//c