Text-Processing

大型單行文件上的基本 sed 命令:無法重新分配記憶體

  • March 27, 2022

我有一個 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

引用自:https://unix.stackexchange.com/questions/105818