패턴을 제거해야 하는 매우 큰 파일이 있습니다. 문제는 파일에 개행 문자가 없다는 것입니다. 제거할 패턴은 다음과 같습니다. ... 1666 more items
여기서 1666은 임의의 숫자일 수 있습니다.
답변1
sed
이것이 최고의 도구인지는 모르겠습니다 . 개인적으로 나는 perl
그런 것을 찾아보았고 다음과 같은 결론을 내렸습니다.
perl -pe 'BEGIN{ $/ = " more items"; } s/\.\.\.\s\d+ more items$//;'
-e
실행할 프로그램 텍스트입니다.
-p
프로그램 텍스트에 대한 암시적 루프가 각 레코드에 대해 한 번 수행됨을 의미합니다(기본적으로 하나의 레코드는 한 줄입니다. 아래 수정 사항 참조).
$/
먼저 기본 줄 바꿈( )의 레코드 구분 기호를 "more items" 문자열로 설정합니다 . 이는 \n
로 표시된 블록 BEGIN { }
의 시작 부분에서 한 번 수행됩니다 .
이제 레코드 구분 기호까지(및 포함) 한 번에 한 청크씩 입력을 읽습니다. 따라서 각 루프의 입력 버퍼에는 "어쨌든... 1234개의 추가 항목"이 있게 됩니다.
이는 s/\.\.\.\s\d+ more items$//
세 개의 점("모든 문자"의 특별한 의미를 제거하기 위해 이스케이프됨), 공백(\s), 하나 이상의 숫자( \d+
) 및 "추가 항목" 텍스트 로 구성된 문자열을 제거하는 대체입니다. 녹음 종료( $
). 기록의 끝 부분을 일치시킬 필요는 없지만 일치 속도를 높일 수 있습니다.
이 옵션으로 인해 기본적으로 결과가 인쇄됩니다 -p
.
답변2
GNU sed(때때로 라고도 함 gsed
)를 사용하는 경우 긴 줄이 메모리 제한에 도달할 수 있습니다.
MacOS나 BSD 등 다른 sed를 사용하는 경우에는 제한이 있습니다. 이것GNU sed 매뉴얼설명하다:
이식 가능한 sed 스크립트를 작성하려는 경우 일부 구현에서는 줄 길이(패턴 및 예약 공간)를 4000바이트 이하로 제한하는 것으로 알려져 있습니다. POSIX 표준은 준수하는 sed 구현이 최소 8192바이트의 행 길이를 지원해야 한다고 지정합니다. GNU sed에는 줄 길이에 대한 기본 제한이 없습니다. 더 많은 (가상) 메모리를 malloc()할 수 있는 한 필요에 따라 줄을 제공하거나 구성할 수 있습니다.
따라서 GNU sed가 있는 경우 제안된 것과 같은 sed 솔루션을 사용할 수 있습니다.@필립스:
sed 's/\.\.\. [0-9]* more items//g'
awk를 사용하세요
대안으로 GNU awk(때때로 호출됨 gawk
)가 있는 경우 다음을 시도해 보십시오.
awk -v RS='\.\.\. [0-9]* more items' 1 ORS="" File
따라서 정규식을 다음 \.\.\. [0-9]* more items
과 같이 사용하십시오.기록 구분 기호입력 및 빈 문자열에 대해기록 구분 기호출력에 대해. 이는 정규 표현식과 일치하는 항목을 제거하는 효과가 있습니다 \.\.\. [0-9]* more items
.
awk는 한 번에 하나의 레코드만 읽기 때문에 sed 솔루션보다 메모리를 덜 소비합니다.