Text-Processing
大型單行文件上的基本 sed 命令:無法重新分配記憶體
我有一個 250 MB 的文本文件,全部在一行中。
在這個文件中,我想用字元替換
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
是的,請
tr
改用:tr 'a' 'b' < file.txt > output.txt
sed
處理線,所以一條巨大的線會導致它出現問題。我希望它在內部聲明一個變數來保存該行,並且您的輸入超過了分配給該變數的最大大小。
tr
另一方面處理字元,應該能夠正確處理任意長的行。
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