2016-08-17 5 views
0

테스트에서 취한 실행 시간 목록이 연속적 (줄 바꿈되지 않음)의 목록이 있습니다. 형식으로 인쇄되어 있습니다 :리눅스에서 문자열에서 패턴을 추출하는 방법

<execution time> s -----> <Testcase name><optionally:[Parameters used by test]> <execution time> s ... <Testcase name> 

예 :

1.2 s -----> Testa[0. param1] 2.4 s -----> Testb 3 s -----> Testc 

이 나에게 각 테스트의 실행 시간을 제공합니다.

문제를 추출하는 것은 공간을 사용하여 분할 할 수 없으며 할당 시간 = split [i] 및 testcase = split [i + 3] (Testa의 경우와 같이 추가 매개 변수가 있음)입니다.

각 시간 간격의 시작 부분에 새 라인을 추가하고 시간과 테스트 케이스 이름 만 추출 할 수 있기를 원합니다.

나는

sed -r 's/^[^0-9]*([0-9]+).*/\1/' /tmp/tmp 

를 수행하여 시간을 얻기 위해 시도했지만 내가 나오지 -r을 지원하지 않습니다 맥 OS를 사용하고 있습니다.

촬영 한 시간과 해당 테스트 케이스 이름을 문자열에서 추출하는 더 좋은 방법이 있습니까? 예를 들어

제공

는, 출력 포맷이 될 수

1.2,Testa[0. param1] 

2.4,Testb 

3,Testc 

PS : I가 주어진 입력하여 입력 파일 패턴

+0

[편집 도움말] (http://stackoverflow.com/editing-help)을 참조하십시오. – Cyrus

+2

당신의 입력의 한 가지 예는 상상력의 스트레칭이 아니라 입력이 취할 수있는 형식의 명세가 아니라 사양이 우리가 필요로하는 것입니다. 전체 사양이없는 경우 최소한 코너 케이스를 다루는 광범위한 예제를 제시 할 수 있습니다. –

+0

2. 고침! –

답변

2
re='([[:digit:].]+ s) ----->([^>]*)(>(.*))?$' 

s='1.2 s -----> Testa[0. param1] 2.4 s -----> Testb 3 s -----> Testc' 

while [[ $s =~ $re ]]; do   # apply POSIX ERE in $re to string in $s 
    curr_time=${BASH_REMATCH[1]}  # first match group is curr_time 
    curr_name=${BASH_REMATCH[2]}  # second match group is curr_name 
    curr_name=${curr_name%' -----'} # strip trailing dashes from curr_name 
    curr_name=${curr_name% * s}  # strip time of next item from curr_name 
    echo "${curr_time% s},$curr_name" # emit output 
    s="${BASH_REMATCH[2]}${BASH_REMATCH[3]}" # strip completed content from string 
done 

...을 방출을 변경 캔트 :

1.2 s Testa[0. param1] 
2.4 s Testb 
3 s Testc 

속보 D 그 구성 요소에 정규식 ([[:digit:].]+ s) ----->([^>]*)(>(.*))?$을 소유 :

  • ([[:digit:].]+ s)BASH_REMATCH[1]을 채우는 첫 번째 일치 그룹을 정의합니다. 최소한 하나의 숫자 또는 마침표와 일치하고 공백과 s이옵니다.
  • ----->은 리터럴 문자열과 일치합니다.
  • ([^>]*)보다 앞에 있고 >가 일치하고 BASH_REMATCH[2]을 형성합니다. 우리는 여기에서 시험의 이름을 추출 할 것입니다.
  • 은 리터럴 >과 나머지 줄이 끝날 때까지 남아있는 내용을 일치시켜 루프를 통해 다음 반복을 위해 아직 처리되지 않은 내용을 캡처 할 수 있도록합니다.
+0

이것이 효과적이었습니다! 정말 고마워. 이걸 설명해 주시겠습니까? –

+0

코드에 주석을 추가했습니다. 더 자세한 설명이 필요한 경우 명확하지 않은 것을 자세히 설명해 주시겠습니까? –

1

는 정말 펄 전문가는 아니지만하지만, PCRE는 lookahead(?=...) 기능이 있습니다 일 (내다)를보고 시간에 따른다면

$ perl -ne 's/ ----->/,/g; s/ (?=[0-9](\.[0-9])* s)/\n/g;print' file 
1.2 s, Testa[0. param1] 
2.4 s, Testb 
3 s, Testc 
  • s/ ----->//g
  • s/ (?=[0-9](\.[0-9])* s)/\n/g 공간을 대체하는 화살의 thingies 제거를
1

3 번째 arg에 대한 GNU awk ch() :

$ cat tst.awk 
BEGIN { OFS="," } 
{ 
    cnt = 0 
    gsub(/----->/,"\n") 
    while (match($0,/\s*([0-9.]+) s \n ([^\n]+)$/,a)) { 
     flds[++cnt] = a[1] OFS a[2] 
     $0 = substr($0,1,RSTART-1) 
    } 
    for (i=cnt; i>0; i--) { 
     print flds[i] 
    } 
} 

$ awk -f tst.awk file 
1.2,Testa[0. param1] 
2.4,Testb 
3,Testc 
관련 문제