web-dev-qa-db-ja.com

大きな1行ファイルの基本的なsedコマンド:メモリを再割り当てできませんでした

250 MBのテキストファイルを1行にまとめています。

このファイルで、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
1 GB RAM

10
Nicolas Raoul

はい、代わりにtrを使用してください:

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

sedはラインで取引するため、巨大なラインは問題を引き起こします。行を保持するために内部的に変数を宣言していて、入力がその変数に割り当てられた最大サイズを超えていると思います。

一方、trは文字を扱い、任意の長い行を正しく処理できるはずです。

10
terdon

Sedとawkの過去のバージョンにはメモリの問題がありましたが、これらは主に最近のバージョンで修正されていますが、この問題の古典的な発生の1つは Larry Wall かなり困難でした。彼の答えは、新しいプログラミング言語を書くことでした-ハードウェア以外のメモリ制限はありません。彼はそれをPerlと呼んだ。特定の問題はより簡単に解決できますが、私が使用する一般的な経験則は、sedがPerlを使用しない場合です。

編集:例をリクエストして:

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
5
hildred