정규식을 사용하여 한 줄 텍스트 파일 검색

정규식을 사용하여 한 줄 텍스트 파일 검색

내가 아는 한 모든 UNIX 텍스트 처리 유틸리티는 한 번에 한 줄씩 읽고 해당 줄에서 작업을 수행합니다.

내가 관심 있는 여러 태그가 포함된 단 한 줄의 텍스트가 포함된 거대한 파일이 있습니다.

파일의 내용은 다음과 같다고 생각할 수 있습니다: xzxzxzzxzxAxzzBxzxCzxxzxxzxzzxzxzAzBzxxxxzzCzxzxzxzxzxxzz

A.*B.*C가 발생할 때마다 (A와 B)와 (B와 C) 사이에 두 개의 문자열을 가져오고 싶습니다. 이 예에서 내가 원하는 출력은 다음과 같습니다.

xzxzx

zxxxzzzz

어떻게 해야 하나요?

편집: 죄송합니다. 명확하게 설명하지 못했습니다. A, B, C는 정규식을 통해서만 식별할 수 있는 긴 문자열입니다.

답변1

awk, perl, , 기타 방법을 사용하면 sed흥미로운 답변을 많이 얻을 수 있을 것이라고 확신합니다. 다음은 tr이 문제를 우리가 해결하는 방법을 알고 있는 문제로 다시 바꾸는 매우 간단한 옵션입니다. 즉 , 한 줄에서 패턴을 찾는 것입니다.

 $ tr 'C' '\n' <test.file | sed -n 's/.*A\(.*\)B\(.*$\)/\1 \2/p'

tr 'C' '\n'명령은 입력의 모든 "C"를 개행 문자로 변환합니다. 따라서 A와 B 사이, B와 줄 끝 사이의 텍스트를 출력하는 명령으로 파이프를 연결해야 합니다.

A, B, C가 단순 문자가 아닌 정규 표현식인 경우 다음을 시도해 보세요.

sed -e 's/C/\n/g' < test.file | sed -n 's/.*A\(.*\)B\(.*\)/\1 \2/p'

이것은 동일한 기본 아이디어를 사용하지만 sed개행을 생성하는 데 사용됩니다.

답변2

어떤 문자로도 끝날 수 있는, 기록할 줄의 개념을 요약합니다. 다음과 같은 여러 구현멍청한, 레코드 구분 기호로 임의의 정규식을 지원합니다. 테스트되지 않음:

gawk -vRS='C' 'sub(/.*A/, "") && sub(/B.*/) {print}'

답변3

라인이 메모리에 들어갈 수 있으면 Perl의 분할 기능을 재사용하면 문제가 해결됩니다. 그렇지 않으면 (Perl sysread 함수를 사용하여) 파일을 청크로 읽고 위에서 설명한 대로 각 청크를 개별적으로 처리하여 관심 있는 문자열이 청크 경계에 걸쳐 있도록 할 것입니다.

관련 정보