正規表現の一致の一部と他のすべての一致のリストを印刷する方法

正規表現の一致の一部と他のすべての一致のリストを印刷する方法

いくつかのテスト結果を要約しているので、次の種類のテキストがあります。

FAILED src/path/to/code.test.js
  Test Suite
    

ベストアンサー1

これはもっと仕事ですperl

perl -lne '
  if (/^\h*at\h.*?\((src.*?\.test\.js):(\d+:\d+)\)/) {
    $total{$1}++;
    $lines{$1}->{$2}++
  }
  END {
    for $file (sort {$total{$b} <=> $total{$a}} keys %total) {
      my $l = $lines{$file};
      print "$total{$file} $file (" . 
      join(", ", map "$l->{$_} - $_", sort {$l->{$b} <=> $l->{$a}} keys %$l) . ")"
    }
  }'

Perl正規表現演算子の*?貪欲なバージョンです。私はそれをサポートする実装を*1つだけ知っています(非標準に対応する実装に加えて)。しかし、それがあなたが使っている実装のようです。これはast-openであり、私が知っている限り、どのシステムでもデフォルトで提供されていません。また、ksh93以外のast-openツールを含めるか含めるかを考慮することが知られているIllumosも同様です。 GNU実装(オプションを導入したもの)では、is(0または1先行原子)は(0以上の文字)に適用されるため、and(0または1以上の文字)と同じです。sed-r-Esedsed-r.*??.*.*.+?.*

おすすめ記事