2016-10-24 15 views
1

私はvimを使用していますが、ピリオド(。)を含む行全体を削除したい次の文字:ö、ä、ëvim regexを使ってピリオドが含まれていて、特定の文字が含まれていない場合に行全体を削除する

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)にもオープンしています。

%s/\.\n//c 
+0

最近のVimsはlogipatプラグインを追加しています。このようなものを使うことができます: 'LP '\。         &&( "[:ööü]") ' –

答えて

1

これは私が得ることができるほど簡単です。フルストップの基本的なチェックを行い、前後にあるすべての行がalt文字でないことを確認してください。先頭の^を置き換えて$\nに置き換えるか、コマンドラインに別のフラグを付けて行単位で検索する必要があります。 VIMで使用するため

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

または翻訳(Sundeepへの賛辞):

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

例:アディソンの答え@https://regex101.com/r/98tOtz/4

+2

これはOP – Sundeep

+3

のための':g/^ [^:öäë] * \。[^:öäë] * $ /正規表現の構文Vim regexpsを 'https:// regex101.com /'に対してテストする大多数のケースでは役に立たない。 –

+0

ありがとう@Sundeep。答えに編集、あなたへの名誉。 – Addison

1

は、この特定のケースのための罰金です。 、これはどこか悪いの文字.*[:öäë]の後行^の先頭から非マッチ\@!をアサート

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

その後、(一致します。ここでは正のマッチが.ほど簡単なことではない場合に、より一般的なソリューションです再びあなたが:globalならびに:substitute両方この正規表現を使用することができますリテラル期間.*\.

)アサーションは任意の文字を消費していなかったとして、最初から:

:%s/^\%(.*[:öäë]\)\@!.*\..*\n//c 
関連する問題