大型单行文件上的基本 sed 命令:无法重新分配内存

Nic*_*oul 10 performance sed large-files text-processing out-of-memory

我有一个 250 MB 的文本文件,全部在一行中。

在这个文件中,我想ab字符替换字符:

sed -e "s/a/b/g" < one-line-250-mb.txt
Run Code Online (Sandbox Code Playgroud)

它失败了:

sed: couldn't re-allocate memory
Run Code Online (Sandbox Code Playgroud)

在我看来,这种任务可以在不分配太多内存的情况下内联执行。
是否有更好的工具,或者更好的使用方法sed


GNU sed 版本 4.2.1
Ubuntu 12.04.2 LTS
1 GB RAM

ter*_*don 10

是的,请tr改用:

tr 'a' 'b' < file.txt > output.txt
Run Code Online (Sandbox Code Playgroud)

sed交易线路,所以一条巨大的线路会导致它的问题。我希望它在内部声明一个变量来保存该行,并且您的输入超过分配给该变量的最大大小。

tr 另一方面处理字符,应该能够正确处理任意长的行。


hil*_*red 8

sed 和 awk 的历史版本有内存问题,这些问题大多在最近的版本中得到修复,但是这个问题的一个经典事件对Larry Wall 造成了很大的打击。他的答案是编写一种新的编程语言——除了硬件之外没有内存限制。他称之为 perl。您的具体问题可以更简单地解决,但我使用的一般经验法则是 sed 不使用 perl。

编辑:通过请求一个例子:

perl -pe "s/a/b/g" < one-line-250-mb.txt
Run Code Online (Sandbox Code Playgroud)

或减少内存使用:

perl -e 'BEGIN{$/=\32768}' -pe "s/a/b/g" < one-line-250-mb.txt
Run Code Online (Sandbox Code Playgroud)