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