정규식 일치의 일부와 기타 모든 일치 목록을 인쇄하는 방법

정규식 일치의 일부와 기타 모든 일치 목록을 인쇄하는 방법

일부 테스트 결과를 요약하고 있으므로 다음과 같은 유형의 텍스트가 있습니다.

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 정규식 연산자의 *?탐욕스럽지 않은 버전입니다 . 나는 그것을 지원하는 구현을 *하나만 알고 있습니다 ( 비표준에 해당하는 구현 외에 ). 그러나 그것이 당신이 사용하고 있는 구현인 것 같습니다. 이것은 ast-open이며, 내가 아는 한 어떤 시스템에서도 기본적으로 제공되지 않습니다. 심지어 ksh93 이외의 ast-open 도구를 포함하거나 포함을 고려하는 것으로 알려진 Illumos도 마찬가지입니다. GNU 구현 (옵션을 도입한 것 ) 에서 is (0 또는 1 선행 원자)는 (0 이상의 문자)에 적용되므로 and (0 또는 1 이상의 문자)와 동일합니다.sed-r-Esedsed-r.*??.*.*.+?.*

답변2

awk '/^[[:blank:]]*at.*\(src.*\.test\.js:[0-9]+:[0-9]+\)/{
    split($0, tmp, /[)(:]/) ## Assuming there is no ), ( and : in the filePath
    fileCnt [tmp[2]]++
    fileErrs[tmp[2], tmp[3]":"tmp[4]]++
}

END{
    for (fileName in fileCnt){
        sep=""
        printf ("%s %s (", fileCnt[fileName], fileName)
        for(file in fileErrs){
            split(file, tmp, SUBSEP)
            if(fileName==tmp[1]){
                printf("%s - %s", sep fileErrs[file], tmp[2])
                sep=", "
            }
        }
        print ")"
    }
}' infile   ## or infiles*

연관된 배열은 fileCnt파일 이름의 개수만 보유합니다. 배열의 키는 파일 이름이고 값은 해당 파일이 본 횟수입니다. 연관된
배열은 fileErrs각 파일 이름에 대한 오류 수를 보유합니다. 여기서 키는 fileName+errNums의 조합입니다.

END 블록에서 처리 중입니다.파일 수파일 수를 배열하고 인쇄 fileCnt[fileName]한 다음 파일 이름 자체를 fileName처리합니다.파일 오류중요한 부분을 배열하고 분할한 다음 첫 번째 부분을 파일 이름과 비교하여 각 파일의 개별 오류를 찾습니다.

답변3

사용행복하다(이전 Perl_6)

~$ raku -ne 'state %h; state $i; ++$i;  \
             if m/ ^ \h* at \h .*?  "(" ~ ")" [(src .*? \.test \.js) \: (\d+ \: \d+)] /   \
             -> { %h.push: $0 => $i ~"|"~ $1 }; END .say for %h;'  file

-ne즉, 코드는 (비자동 인쇄) 명령줄 플래그를 사용하여 입력 파일에서 한 줄씩 실행됩니다. 해시 값이 제공됩니다 %h. $i반복자가 선언되었습니다. 각 행마다 $i반복자가 증가합니다. if정규식과 일치하는 조건부 테스트비슷하지만 같지는 않다@Stephane_Chazelas가 게시한 Perl5 코드로 이동하세요. 그러나 이 Raku 정규식은 멋진(최신) 기능인 Raku의 ~중첩된 데이터 구조 물결표 구문을 사용합니다 "(" ~ ")" [ … ]. Raku 정규식은 경로 $0와 콜론으로 구분된 숫자를 캡처합니다 $1.

일치하는 항목이 한 줄씩 발견되면 해시 push에 추가 됩니다: ( 경로)는 키로 사용되며 값은 코드를 사용하여(사용: 사용) 캡처된 숫자 부분에 연결된 줄 번호가 됩니다. 해시에는 중복 키가 존재할 수 없으므로 각 키(예: 경로)는 서로 다른 값을 누적합니다. 읽기 라인의 끝에서 해시 값이 출력됩니다.%h$0~$1$i ~"\t"~ $1END%h

입력 예:

#See above. OP's original file was concatenated 5 times, 
#one record was altered (path and digits).

출력 예(1):

src/path/to/code.test.js => [13|31:415 27|31:415 55|31:415 69|31:415]
src/path/to/othercode.test.js => 41|32:416

개수의 선행 열을 얻으려면 뒤의 코드를 END다음으로 바꿉니다.

for %h.kv -> $k,$v {say $v.elems, "\t", $k => $v};

출력 예(2):

4   src/path/to/code.test.js => [13|31:415 27|31:415 55|31:415 69|31:415]
1   src/path/to/othercode.test.js => 41|32:416

[참고: 해시가 관련된 경우 say일반적으로 화살표로 구분된 출력이 생성됩니다. 위에서 간단히 최종 명령을 ]로 변경하면 key => value탭으로 구분된 키-값 출력을 얻을 수 있습니다.sayput

https://docs.raku.org/언어/regexes#Tilde_for_nesting_structs
https://docs.raku.org/언어/hashmap
https://raku.org

관련 정보