Ich versuche, ed
die erste Zeile einer großen Datei zu bearbeiten, muss aber warten, ed
bis alle Zeilen gelesen sind. Gibt es eine Möglichkeit, ed
das Lesen der gesamten Datei zu unterbrechen und sofort mit der Bearbeitung zu beginnen, wobei die aktuelle Zeile die erste Zeile ist?
Antwort1
Wie von Shellter angemerkt, ed
ist dies nicht möglich. Die meisten Bearbeitungsvorgänge erfordern, dass die Datei neu geschrieben wird. Nur Ersetzungen können direkt vor Ort vorgenommen werden. In diesem Fall können Sie verwenden hexedit(1)
.
Der am wenigsten speicherintensive Weg ist die Verwendung sed
von Operationen, z. B. zum Ersetzen vonAugustmitJuniin der ersten Zeile:
sed '1s/August/June/' FILE > NEWFILE
Antwort2
Es ist nicht möglich, ed
das Einlesen einer gesamten Datei zu stoppen oder nach dem Öffnen eines Dokuments mit dem Editor die erste Zeile des Bearbeitungspuffers automatisch zur aktuellen Zeile zu machen.
Der ed
Editor platziert Sie immer in der letzten Zeile, die von einem Befehl betroffen ist (oder direkt danach oder davor, wenn der Befehl ist d
), und das Einlesen einer Datei beim Start ist vergleichbar mit der Verwendung von e filename
, das den aktuellen Bearbeitungspuffer verwirft, die benannte Datei zum Bearbeiten öffnet und die aktuelle Zeile auf die letzte aus der Datei gelesene Zeile setzt.
Möchten Sie Änderungen an einem großen Dokument auf nicht-interaktive Weise vornehmen, dann sind die Verwendung von sed
oder awk
möglicherweise bessere Alternativen, da diese Tools mit Streams arbeiten und standardmäßig nicht das gesamte Dokument in den Speicher lesen.
Wenn Sie große Dokumente wirklich interaktiv bearbeiten möchten, können Sie versuchen, das Dokument mit in Abschnitte aufzuteilen split
, die Abschnitte, die Sie ändern möchten, zu bearbeiten (mit ed
oder vi
oder einem anderen Editor) und cat
die Abschnitte dann einfach mit wieder zusammenzufügen.
Hypothetische Bearbeitungssitzung zum Bearbeiten der ersten 5 Zeilen einer großen Datei in ed
:
$Ed. e! Kopf -n 5 riesige Datei 123 g/^/m0 w ! { cat - ; tail -n +6 riesige Datei ; } > riesige Datei.neu Q
Das heißt, eine Aufforderung, die Ausgabe von zu bearbeiten head -n 5 hugefile
. Die Bearbeitung, die ich hier vornehme, besteht einfach darin, die Zeilen umzukehren ( g/^/m0
, „verschiebe jede Zeile nacheinander vor die erste Zeile“). Dann schreibe ich den geänderten Bearbeitungspuffer in einen Shell-Befehl, der den Inhalt des Puffers mit Zeile 6 und weiter aus der Originaldatei verknüpft. Das Ergebnis wird in einen neuen Dateinamen geschrieben. Q
Dann beendet ich den Editor.