큰 한 줄 파일의 기본 sed 명령 : 메모리를 다시 할당 할 수 없습니다 텍스트 파일이

250MB 텍스트 파일이 모두 한 줄에 있습니다.

이 파일에서 a문자를 b문자 로 바꾸고 싶습니다 .

sed -e "s/a/b/g" < one-line-250-mb.txt

다음과 같이 실패합니다.

sed: couldn't re-allocate memory

이런 종류의 작업은 많은 메모리를 할당하지 않고 인라인으로 수행 될 수있는 것 같습니다.
작업에 더 적합한 도구가 있습니까, 아니면 더 나은 방법이 sed있습니까?


GNU sed 버전 4.2.1
Ubuntu 12.04.2 LTS
1GB RAM



답변

예, tr대신 사용하십시오.

tr 'a' 'b' < file.txt > output.txt

sed줄을 다루면 큰 줄이 문제를 일으킬 것입니다. 내부적으로 변수를 선언하여 줄을 유지하고 입력이 해당 변수에 할당 된 최대 크기를 초과합니다.

tr 반면에 문자를 다루며 임의로 긴 줄을 올바르게 처리 할 수 ​​있어야합니다.


답변

sed와 awk의 역사적 버전에는 메모리 문제가 있었는데, 이들은 대부분 최신 버전에서 수정되었지만이 문제의 고전적인 발생 중 하나는 Larry Wall을 매우 강하게 때렸 습니다. 그의 대답은 하드웨어 이외의 메모리 제한없이 새로운 프로그래밍 언어를 작성하는 것이 었습니다. 그는 그것을 펄이라고 불렀다. 귀하의 특정 문제는 더 간단하게 해결 될 수 있지만, 일반적으로 sed가 펄을 사용하지 않을 때 사용하는 일반적인 규칙입니다.

편집 : 예를 들어 요청 :

perl -pe "s/a/b/g" < one-line-250-mb.txt

또는 적은 메모리 사용량 :

perl -e 'BEGIN{$/=\32768}' -pe "s/a/b/g" < one-line-250-mb.txt