이 정규식이 awk에서 작동하지 않는 이유는 무엇입니까?

이 정규식이 awk에서 작동하지 않는 이유는 무엇입니까?

다음과 같은 텍스트 파일이 있습니다.

Attribute 1.............. : attribute value
Encode Date............................. : JUL 2007
Attribute 22076.......... : attribute value`

세그먼트 를 추출하고 싶지만 JUL 2007이 파일의 다른 곳에 나타날 수 있으므로 세그먼트 JUL 2007앞에 "JUL 2007"이 있는 경우에만 가능합니다 .Encode Date

다음 정규식은 전역 및 여러 줄 모드가 활성화된 PHP 인터프리터를 사용하여 regexr.com에서 테스트할 때 작동합니다.

(?<=Encode Date............................. : ).*$

하지만 이 명령을 실행해도 아무런 결과가 나오지 않습니다. 무엇이 누락되었나요?

cat file.txt | awk '/(?<=Encode Date............................. : ).*$/{print $0}'

답변1

awk지원하다POSIX 확장 정규식(오히려). Perl 호환 정규 표현식(PCRE)을 사용하려고 합니다. ERE에는 (?<=...)("역방향 주장") 이 없습니다.

입력에서 인코딩된 날짜를 얻으려면 다음을 고려하십시오.

awk -F ':' '$1 ~ /^Encode Date/ { sub("^ ", "", $2); print $2 }' file

이는 각 행을 :분리된 필드로 처리합니다. 첫 번째 필드가 문자열로 시작하는 줄을 선택 Encode Date하고 인쇄하기 전에 해당 줄의 두 번째 필드 시작 부분에서 공백을 제거합니다.

사용하면 sed약간 더 짧아집니다 .

sed -n '/^Encode Date/s/.*: //p' file

그러면 올바른 줄을 찾은 다음 :그 바로 뒤의 모든 공백(포함)을 제거하고 수정된 줄을 출력합니다.

또는 sed각 줄을 수정하고 성공적으로 수정된 줄을 인쇄하는 것과 동일한 작업을 사용하십시오.

sed -n 's/^Encode Date.*: //p' file

전체 줄을 인쇄하려면(마지막 명령처럼) 다음을 사용하십시오.

awk '/^Encode Date/' file

또는,

sed -n '/^Encode Date/p' file

또는,

grep '^Encode Date' file

관련된:

관련 정보