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


10

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



4
그 질문은 매우 복잡한 여러 줄 표현에 관한 것입니다. 내 질문은 당신이 상상할 수있는 가장 기본적인 표현에 관한 것입니다.
Nicolas Raoul

@RubanSavvy plus, 다른 Q에 대한 답변 중 어느 것도 긴 줄을 고려하지 않으며 실제로 둘 다 같은 문제가있을 것입니다.
terdon

이 Q에 sed 버전과 하드웨어 정보 (특히 RAM) 및 배포 버전을 포함시킬 수 있습니까?
slm

답변:


10

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

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

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

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


흥미롭게도 방금 "abcabc ..."로 채워진 250MB 파일을 만들었고 sed -e "s/a/z/g" b.txt > c.txt아무런 문제없이 할 수있었습니다 . sed (GNU sed) 사용하기 4.2.2.
slm

@slm은 496M 파일과 동일한 sed버전에서 동일 하지만 구현 또는 하드웨어에 따라 다릅니다.
terdon

예, 추측을해야한다면 이전 버전의을 처리하고 sed있습니다.
slm

5

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

1
이 전체 단락은 "Perl"로 요약됩니다. 일부 세부 사항은 좋을 수도 있고 적어도 예 또는 다른 것입니다
Michael Mrozek

@MichaelMrozek 나는 모자 수집이 roboediting으로 이어지는 경향이 있다는 것을 알고 있지만, 나는 당신의 명성으로 조금 더주의를 기울일 것이라고 생각했습니다. 특히 특정 문제가 이미 매우 좁은 방식으로 해결되어 대부분의 사람들이 검색하는 데 도움이되지 않으므로 일반적인 경우에 대한 답변을 추가했습니다. 내가 제공 한 확장 된 답변은 Nicolas Raoul에 도움이 될 것입니다. 가능한 솔루션이 아직 없다면, 다른 많은 사람들에게 도움이 될지 의심 스럽지만 원래의 답변은 sed의 한계에 도달 한 모든 사람에게 도움이 될 것입니다. 동의하지 않으면 삭제하겠습니다.
초에 취소됨

@hildred 나는 욕구 동기에 대한 비난에 즉시 의지하지 않고 중재자가 귀하의 답변에 대한 유효한 의견을 제시 할 때 중재자의 성실을 취할 수 있다고 묻는 것이 너무 많이 생각하지 않는다고 생각합니다 (모자, 정말로?!).
Chris Down

@ChrisDown 반대로-나는 전적으로 모자를 쓰고 있습니다. 또한 이것은 여러 사람들이 대답하지 않은 것으로 표시되었지만, 모자보다 먼 우선 순위입니다
Michael Mrozek

메모리 제한이있는 두 번째 것은 트릭을 수행했습니다 (2.5GB 1 줄 파일의 경우). 감사합니다! sed그래도 조금 실망했습니다 . : \
Tomislav Nakic-Alfirevic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.