Vimに単語を含まない行を削除する[複製]


2

この質問にはすでに答えがあります:

Vimでは、特定のテキスト文字列を含む行にのみ興味があり、他のすべての行を削除したいことがよくあります。

文字列を含む行を一致させるのは簡単です:

:s/^.*foo.*\n//

私が通常行うことは、2つのパスです。1つは、特別な最初の文字で必要なすべての行を「フラグ」するためのものです。

:s/^\(.*foo.*\)$/X\1/

また、2番目のパスでは、固定位置にある1文字に対して否定一致を簡単に実行できるため、文字列のないすべての行を削除します。

:s/^[^X].*\n//

しかし、1回のパスでこれを行うためのはるかに簡単な方法はありませんか?私は何が欠けていますか?


私はその時にそれを見つけられなかったにもかかわらず、これは以前に尋ねられたと思います:vimは特定の単語を含まないすべての行を削除します
hippietrail

回答:


9

これにより、を含まないすべての行が削除されますfoo

:g/^\(.*foo\)\@!.*$/d

代わりに、:v検索パターンの意味を逆にするために使用することもできます。

:v/\(foo\)/d

ここで方法:g:v作業の詳細を読むことができます

また、範囲の定義、メタ文字の使用などの詳細については、こちらをご覧ください


これ:gは、私がこれまでに学んだことのない非常に多くのvimコマンドの1つです-ありがとう!(-:
ヒッピートレール

なぜ、\(\)
ベルンハルト

1
+?|{}(、と)彼らの特別な機能を使用するためにエスケープする必要があります。
-abhshkdz

私が使用:gして:v多くのことを。何らかの理由で:v固まらない場合は、を使用できます:g!
ロメイン

0

まあ、テキストの行を削除することだけが目的の場合は、awkを使用して簡単に実行できます。

awk '/regex/{print}' filename

意味awkはファイル名に作用します。次のように、新しいファイル名または同じファイル名にパイプすることができます-

   awk '/regex/{print}' filename > filename.tmp && mv filename.tmp filename

使用するすべてのプラットフォームにvimがインストールされていますが、通常* nixを使用している場合にのみawkがあります。最近、私は主にWindowsを使用しています。したがって、私はvimベースの答えを探します。どうもありがとう。
ヒッピートレール

私の最初の解決策が機能しないことに気付いたので...これをすべて使用する場合は、このようにする必要があります!
キッチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.