同じ行の複数のインスタンスを 1 つのインスタンスのみに置き換えますか?

同じ行の複数のインスタンスを 1 つのインスタンスのみに置き換えますか?

タイトルがまさにそれを物語っています。基本的に、私は膨大なログ ファイルを圧縮しようとしています。

Notepad++ と Regex (少しは知っています) はこれらの繰り返し行を削除できますが、問題は、すべてを削除したくないということです。ログ メッセージの構造/順序を維持するために、1 つのインスタンスを残しておきたいのです。

私は多くの答えをグーグルで検索しましたが、次のような結果しか得られませんでしたこれ問題は、単に行を置き換えたり除外したりしようとしているのではないということです。

この時点では、Regex が答えを持っている可能性が高いと思いますが、まだどのようなツールが利用できるか分からない段階です。

編集:

何千ものメッセージがあるが、そのうちの 1 つだけを確認する必要がある例: (すべての SCSI デバイスが独自のメッセージをチップに挿入しようとするため、このようなメッセージは大量に表示されます。各デバイスで発生しているかどうかではなく、発生していることだけを確認する必要があります)。

multipathd[4893]: 3600a098000badf6800005dfe5a8cd2cd: sdie - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000badf6800005def5a8cd273: sdgq - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000badf6800005df05a8cd27b: sdeq - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000bae10c00005df55a8cd2ec: sdgw - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000bae10c00005df05a8cd2c2: sdfk - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000bae10c00005dec5a8cd2a3: sdgm - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000badf6800005df35a8cd292: sdfo - rdac checker reports path is down: ctlr is in startup sequence

でも、私はただ

rdac checker reports path is down: ctlr is in startup sequence

答え1

複数のインスタンスが連続している場合は、次の操作を実行できます。

新しいリクエストに応じて更新:

  • Ctrl+H
  • 検索対象:^([^-]+- )(.+)(?:\R(?1)\2)+
  • と置換する:$2
  • チェック ラップアラウンド
  • 正規表現をチェック
  • チェックしないでください. matches newline
  • Replace all

説明:

^           : beginning of line
  (         : start group 1
    [^-]+-  : 1 or more NOT dash,then a dash and a space
  )         : end group 1
  (         : start group 2
    .+      : 1 or more any character
  )         : end group 2
  (?:       : start non capture group 
    \R      : any kind of linebreak
    (?1)    : same pattern than group 1 (ie. "[^-]+- ")
    \2      : backreference to group 2
  )+        : end non capture group, must appears 1 or more times.

交換:

$2      : content of group 2

与えられた例の結果:

rdac checker reports path is down: ctlr is in startup sequence

複数のインスタンスが連続していない場合は、お気に入りのスクリプト言語でスクリプトを記述することをお勧めします。

目的を果たす Perl ワンライナーを以下に示します。

perl -aE 'chomp;(undef,$x)=split(/-/,$_);next if exists $s{$x};$s{$x}=1;say$x' inputfile

関連情報