特定の単語を含む行を削除する方法。ただし、他の単語が見つかった場合は、その行を削除しないでください。たとえば、またはsup
ある行を削除しますgnd
が、ループ行を破る一部の行も削除します:%s/.*sup.*//g
。:%s/.*gnd.*//g
module
orと同じ行にある行を削除したくありません。この行を征服する方法をご存知ですか?gnd
sup
答え1
あなたが使用できる:
:v/module/s/\v.*(sup|gnd).*//
:v/pattern/cmd
cmd
実行ラインで実行いいえパターンマッチ\v
開いている素晴らしいこのようにして、すべての文字(
は|
プレフィックスなしで正規表現演算子として扱われます\
。
参考にしてください空しかし他にはありません。削除するsup
またはを含む行gnd
。これを削除するには、g
/コマンドを入れ子にすることはできないため、1つのコマンドに否定予測正規表現演算子を使用v
できます。vim
g
:g/\v^(.*module)@!.*(sup|gnd)/d
:g/pattern/cmd
cmd
行を走っているするパターンマッチ(pattern)@!
(そして素晴らしい)は、次の場合、幅は0に一致します。模様その場所には一致がないため、^(.*module)@!
含まれていない行の先頭に一致がありますmodule
。
sed
またはにパイプするオプションもありますawk
。
:%!sed -e /module/b -e /sup/d -e /gnd/d
/module/b
module
.- 含まれていない行の場合は、次の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バイトの通常のファイルを見つけて(小さいファイルにはsup
(gnd
および行区切り文字)を含む行が含まれる可能性が低い)、そのファイルへのgawk
パスを引数として使用して実行します。gawk
どのファイルでも一致する行が見つかった場合は、FILENAME
NUL文字(の場合xargs -0
)で区切られたファイルパス(特殊変数)を印刷して、次のファイルに移動します。xargs -r0
gawk
出力プロセスは、これらのファイルパスを引数として使用して実行されます。sed
sed
ファイルを適切に編集します。
答え2
v/(module\|input\|output)/s/\v であることが確認されました。。/