4

ログを読み取るPerlスクリプトを作成しているので、4行以上の連続した空白行が表示された場合に空の行を削除して、ファイルを新しいログに再書き込みします。つまり、4つの連続する空白行(またはそれ以上の行)を1行に圧縮する必要があります。ただし、ファイル内の1、2、または3行の場合は、フォーマットを維持する必要があります。私は解決策をオンラインで入手しようとしましたが、私が見つけることができるのは

perl -00 -pe ''

また

perl -00pe0  

:%s/^\n\{4}//また、私が探しているものと一致する4つの空の行のブロックを削除するこのようなvimの例を見ると、 Perlではなくvimにありました。誰かがこれを手伝うことができますか?ありがとう。

4

5 に答える 5

8

4つ以上の連続するUnixスタイルのEOLを1つの改行に折りたたむには:

$ perl -0777 -pi.bak -e 's|\n{4,}|\n|g' file.txt

後読みを使用した代替フレーバー:

$ perl -0777 -pi.bak -e 's|(?<=\n)\n{3,}||g' file.txt
于 2012-09-06T11:56:09.967 に答える
1
use strict;
use warnings;

my $cnt = 0;

sub flush_ws {
  $cnt = 1 if ($cnt >= 4);
  while ($cnt > 0) {print "\n"; $cnt--; }
}

while (<>) {
  if (/^$/) {
    $cnt++;
  } else {
    flush_ws();
    print $_;
  }
}
flush_ws();
于 2012-09-06T10:08:26.603 に答える
0

モードでファイル全体を丸呑みするために-0使用できるので、ヒントは良いものです。perlrunでこれらの人についてもっと読むだから、このワンライナーはトリックを行う必要があります:-0777-p

$ perl -0777 -pe 's/\n{5,}/\n\n/g'

連続して最大4つの新しい行がある場合、何も起こりません。5つ以上の改行(4つ以上の空の行)は、2つの改行(1つの空の行)に置き換えられます。/g最初の一致だけでなく、ここでの切り替えに注意してください。

解凍されたコード:

BEGIN { $/ = undef; $\ = undef; }
LINE: while (defined($_ = <ARGV>)) {
    s/\n{5,}/\n\n/g;
}
continue {
    die "-p destination: $!\n" unless print $_;
}

HTH!:)

于 2012-09-06T12:20:18.447 に答える
0

を使用する1つの方法GNU awkで、レコード区切り文字をNULに設定します。

awk 'BEGIN { RS="\0" } { gsub(/\n{5,}/,"\n")}1' file.txt

これは、空の定義が空白を除外していることを前提としています

于 2012-09-06T12:45:58.930 に答える
0

これはあなたが必要なことをします

perl -ne 'if (/\S/) {$n = 1 if $n >= 4; print "\n" x $n, $_; $n = 0} else {$n++}' myfile
于 2012-09-06T13:41:27.410 に答える