Ich habe eine 250 MB Textdatei, alles in einer Zeile.
In dieser Datei möchte ich a
Zeichen durch b
Zeichen ersetzen :
sed -e "s/a/b/g" < one-line-250-mb.txt
Es schlägt fehl mit:
sed: couldn't re-allocate memory
Es scheint mir, dass diese Art von Aufgabe inline ausgeführt werden könnte, ohne viel Speicher zuzuweisen.
Gibt es ein besseres Werkzeug für den Job oder eine bessere Verwendung sed
?
GNU sed Version 4.2.1
Ubuntu 12.04.2 LTS
1 GB RAM
text-processing
sed
performance
large-files
out-of-memory
Nicolas Raoul
quelle
quelle
Antworten:
Ja, verwenden Sie
tr
stattdessen:sed
Geschäfte in Linien, so dass eine große Linie es Probleme verursachen wird. Ich gehe davon aus, dass eine Variable intern deklariert wird, um die Zeile zu halten, und Ihre Eingabe die dieser Variablen zugewiesene maximale Größe überschreitet.tr
Auf der anderen Seite handelt es sich um Zeichen und sollte in der Lage sein, beliebig lange Zeilen korrekt zu behandeln.quelle
sed -e "s/a/z/g" b.txt > c.txt
ohne Probleme auskommen . Verwendung von sed (GNU sed) 4.2.2.sed
Version gleich, denke, es hängt von der Implementierung oder der Hardware ab.sed
.Historische Versionen von sed und awk hatten Speicherprobleme, diese wurden größtenteils in neueren Versionen behoben, aber eines der klassischen Vorkommen dieses Problems traf Larry Wall ziemlich hart. Seine Antwort war, eine neue Programmiersprache zu schreiben - ohne andere Speicherbeschränkungen als Hardware. Er nannte es Perl. Ihr spezifisches Problem kann einfacher gelöst werden, aber die allgemeine Faustregel, die ich verwende, lautet, wenn sed kein Perl verwendet.
Bearbeiten: auf Anfrage ein Beispiel:
oder für weniger Speicherbedarf:
quelle
sed
. : \