sed などを使用して、複数の行 (つまり、「Directory」の後に 2 つの空白行が続く行) を一致させて削除しますか?

sed などを使用して、複数の行 (つまり、「Directory」の後に 2 つの空白行が続く行) を一致させて削除しますか?

ハード ドライブ上のすべてのディレクトリをリストしたファイルがあります。 「Directory」という単語の後に 2 つの空白行が続く行のインスタンスをすべて削除します。つまり、シーケンスが発生するたびに、これらの 3 つの行をすべて削除します。

"<DIR> ."、、"<DIR> .."および--を含む行はすべて削除しました"0 Files"が、まだいくつか残っています。

元のタスクは、次のパターンで各 6 行のシーケンスを削除することでした。

Directory of m:\Winter Interludes

12/20/2020  10:24 PM    DIR          .
12/20/2010  10:24 PM    DIR          ..
               0 File(s)              0 bytes

答え1

パール:

ファイル全体を配列に取り込む

配列インデックスをループする

フラグが設定されておらず、最初の一致が見つかった場合はフラグを設定します

フラグと2行目が一致する場合、別のフラグを設定する

フラグと3行目が一致する場合は、配列から3行を削除します。

ループ終了

変更された配列を印刷して戻す

Pythonでも動作するはずです

--

複数の行にまたがって一致させるために単一の正規表現を使用したい場合、perl にはそのための正規表現後フラグ「m」があります。perlre より:

m 文字列を複数行として扱います。つまり、^'' and$'' を文字列の先頭または末尾のみに一致するものから、文字列内の任意の行の先頭または末尾に一致するものに変更します。

s 文字列を 1 行として扱います。つまり、.'' to match any character whatsoever, even a newline, which it normally would not match. The /s and /m modifiers both override the $* setting. That is, no matter what $* contains, /s without /m will force ^'' を文字列の先頭にのみ一致するように変更し、$'' to match only at the end (or just before a newline at the end) of the string. Together, as /ms, they let the.'' を任意の文字に一致させます。ただし、^'' and$'' はそれぞれ文字列内の改行の直後と直前に一致させることができます。

答え2

perl -0777 -p -e 's/[^\n]*ディレクトリ[^\n]*\n\n\n//sg' 入力

答え3

vim では、次のように使用できます: :%s:Directory{ctrl+v, return}{ctrl+v}return:

関連情報