特定の構文を含む行を削除しますが、他の単語を含む行は避けたいと思います。

特定の構文を含む行を削除しますが、他の単語を含む行は避けたいと思います。

特定の単語を含む行を削除する方法。ただし、他の単語が見つかった場合は、その行を削除しないでください。たとえば、またはsupある行を削除しますgndが、ループ行を破る一部の行も削除します:%s/.*sup.*//g:%s/.*gnd.*//g

moduleorと同じ行にある行を削除したくありません。この行を征服する方法をご存知ですか?gndsup

ベストアンサー1

あなたが使用できる:

:v/module/s/\v.*(sup|gnd).*//
  • :v/pattern/cmdcmd実行ラインで実行いいえパターンマッチ
  • \v開いている素晴らしいこのようにして、すべての文字(|プレフィックスなしで正規表現演算子として扱われます\

参考にしてくださいしかし他にはありません。削除するsupまたはを含む行gnd。これを削除するには、g/コマンドを入れ子にすることはできないため、1つのコマンドに否定予測正規表現演算子を使用vできます。vimg

:g/\v^(.*module)@!.*(sup|gnd)/d
  • :g/pattern/cmdcmd行を走っているするパターンマッチ
  • (pattern)@!(そして素晴らしい)は、次の場合、幅は0に一致します。模様その場所には一致がないため、^(.*module)@!含まれていない行の先頭に一致がありますmodule

sedまたはにパイプするオプションもありますawk

:%!sed -e /module/b -e /sup/d -e /gnd/d
  • /module/bmodule.
  • 含まれていない行の場合は、次の2つのコマンドを実行し続けるか、supそれぞれ含まれている行を削除しますgnd

または:

:%!awk '/sup|gnd/ && ! /module/'

欲しいなら探すこの行を削除して削除する必要があるファイルの場合は、スキップしてvimテキスト処理ユーティリティを使用して操作全体を完了できます。 GNUシステムでは:

find . ! -name '*.back' -type f -size +3c -exec gawk '
  /sup|gnd/ && ! /module/ {printf "%s\0", FILENAME; nextfile}' '{}' + |
  xargs -r0 sed -i.back -e /module/b -e /sup/d -e /gnd/d

(ここで元のファイルのバックアップはとして保存されthe-file.back、バックアップが不要な場合に変更します。)-i.back-i

  • find.back名前で終わらず、サイズが最小4バイトの通常のファイルを見つけて(小さいファイルにはsupgndおよび行区切り文字)を含む行が含まれる可能性が低い)、そのファイルへのgawkパスを引数として使用して実行します。
  • gawkどのファイルでも一致する行が見つかった場合は、FILENAMENUL文字(の場合xargs -0)で区切られたファイルパス(特殊変数)を印刷して、次のファイルに移動します。
  • xargs -r0gawk出力プロセスは、これらのファイルパスを引数として使用して実行されます。sed
  • sedファイルを適切に編集します。

おすすめ記事