정규 표현식이 예상 데이터와 일치하지 않습니다.

정규 표현식이 예상 데이터와 일치하지 않습니다.

다음 명령을 사용하여 필터 기준에 따라 데이터를 추출하려고 시도했지만 awk작동하지 않습니다. 이 문제를 고칠 수 있나요?

awk -v RS='' -v ORS='\n\n' '/func: peak*down*HIL/' filename

입력하다:

func: peak_rec_head_HIL
sub: xyz
value: adc
log:path
close:date

func: peak_some_down_head_HIL
sub: xyz
value: adc
log:path
close:date

func: peak_another_one_down_head_HIL
sub: xyz
value: adc
log:path
close:date

func: peak_rec_head_HIL
sub: xyz
value: adc
log:path
close:date

func: peak_another_one_down_head_joy_HIL
sub: xyz
value: adc
log:path
close:date

예상 출력:

func: peak_some_down_head_HIL
sub: xyz
value: adc
log:path
close:date

func: peak_another_one_down_head_HIL
sub: xyz
value: adc
log:path
close:date

func: peak_another_one_down_head_joy_HIL
sub: xyz
value: adc
log:path
close:date

답변1

문제는 정규 표현식에 있습니다. 하위 문자열 사이의 임의의 문자 수와 일치하도록 *각각 을 바꿔야 합니다 ..*

awk -v RS='' -v ORS='\n\n' '/func: peak.*down.*HIL/' file

각각은 *표현식의 이전 부분의 동작을 수정하여 0번 이상 일치하도록 합니다. 이 표현식은 , 등 중 하나 peak*down와 일치합니다 peadown.peakdownpeakkdownpeakkkdown

파일 형식이 사용하는 것과 동일하기 때문에GNU 슬래시, 저는 개인적으로 데이터를 쿼리(또는 일반적으로 사용)하는 recsel대신 다음을 사용합니다 .awk

recsel -e 'func ~ "peak.*down.*HIL"' file

범용 텍스트 처리 도구보다 데이터 형식을 이해하는 도구를 사용하는 것이 더 나은 경우가 많습니다(더 쉽고, 더 강력하며, 유지 관리가 더 쉽습니다).

관련 정보