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


10

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

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

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



4
这个问题是关于一个非常复杂的多行表达式。我的问题是您可以想象的最基本的表达方式。
Nicolas Raoul

@RubanSavvy加上,另一个Q的答案都没有考虑长线,实际上,两个答案都可能有相同的问题。
terdon

您可以在此Q中包括您的sed版本以及您的硬件信息(特别是RAM)和发行版吗?
slm

Answers:


10

是的,tr改为使用:

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

sed排队交易,所以很大的一行会引起问题。我希望它是在内部声明一个变量来保存该行,并且您的输入超出了分配给该变量的最大大小。

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


奇怪的是,我刚刚创建了一个250MB的文件,里面带有“ abcabc ...”,并且能够做到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遭受了重创。他的答案是写一种新的编程语言-除硬件外没有内存限制。他称它为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

1
这整个段落归结为“ Perl”。一些细节将是很好的,或者至少是一个例子或类似的东西
Michael Mrozek

@MichaelMrozek我意识到帽子收藏的确会导致机器人编辑,但是我认为您的声誉值得密切关注。特别是因为已经以一种非常狭窄的方式解决了特定问题,这对大多数人都没有帮助,所以我为一般情况添加了一个答案。如果还没有可行的解决方案,我提供的扩展答案将对Nicolas Raoul有所帮助,但我怀疑它是否会对其他很多人有所帮助,而我的原始答案将帮助达到sed极限的每个人。如果您不同意,我将删除
hildred

@hildred我认为要求主持人在对您的回答进行有效评论时可以表现出真诚,而不会立即诉诸别有用心(真的吗?!)。
克里斯·唐尼

@ChrisDown相反-我完全是为了帽子。同样,这被多个人标记为不是一个答案,但这是帽子的第二优先权
Michael Mrozek

第二个有内存限制的方法成功了(我的2.5GB 1行文件):谢谢!sed不过,您对此感到失望。:\
Tomislav Nakic-Alfirevic '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.