다음과 같은 텍스트 파일이 있습니다.
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
관련된: