변수 sed 모드가 문자열을 삭제합니다.

변수 sed 모드가 문자열을 삭제합니다.

패턴을 제거해야 하는 매우 큰 파일이 있습니다. 문제는 파일에 개행 문자가 없다는 것입니다. 제거할 패턴은 다음과 같습니다. ... 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 솔루션보다 메모리를 덜 소비합니다.

관련 정보