-
head
/tail
fast die gesamte Datei durchlaufen müssen (abhängig von der Position der Zeile, die Sie als Parameter angeben).
Dann kopieren Sie das Ergebnis in eine neue Datei und löschen die alte. -
Ich bin mir nicht sicher, ob
sed
wird die gesamte Datei iterieren, aber Sie müssen dieses Ergebnis in eine neue Datei kopieren und die alte löschen. Auch mit-i
(an Ort und Stelle) erstellt es eine temporäre Datei unter der Haube, also gilt dasselbe.
Warum bewegen Sie nicht einfach den Zeiger, der auf die erste Zeile der Datei zeigt, und verschieben ihn in die gewünschte Zeile?
Wie konnten wir so etwas tun? Muss ich in C tun? Gibt es einen anderen Weg?
Ist das sinnvoll ?? Ich denke falsch? Wenn ja, warum?
Akzeptierte Antwort:
Warum bewegen Sie nicht einfach den Zeiger, der auf die erste Zeile der Datei zeigt, und verschieben ihn in die gewünschte Zeile?
Denn es gibt keinen „Zeiger, der auf die erste Zeile der Datei zeigt“.
Die grundlegenden Operationen zum Ändern einer Datei sind:Überschreiben einer Reihe von Bytes (d. h. Ersetzen eines Teils durch Daten derselben Länge), Anhängen (d. h. am Ende hinzufügen), Abschneiden (d. h. am Ende entfernen).
Die meisten Dateisysteme speichern Dateien in Blöcken fester Größe, außer dass der letzte Block teilweise sein kann. Es gibt keine Möglichkeit, die vorhandenen Daten zu ändern, wenn die Änderung die Größe des geänderten Elements ändern würde, es sei denn, die Änderung befindet sich am Ende oder die Änderung würde Daten um eine ganze Anzahl von Blöcken verschieben. Das Verschieben von Daten um eine ganze Anzahl von Blöcken würde nur zufällig funktionieren, und dafür gibt es keine weit verbreitete Schnittstelle¹.
Die effizienteste Methode zum Entfernen von Daten am Anfang einer Datei besteht darin, die Daten, die aufbewahrt werden müssen, in eine neue Datei zu kopieren. Genau das ist tail -n +42
oder sed '41,$p'
tun.
¹ Moderne Linux-Systeme haben einen Systemaufruf, um einen Teil einer Datei zu entfernen:fallocate(fd, FALLOC_FL_COLLAPSE_RANGE, …)
, die Sie über das Hilfsprogramm fallocate --collapse-range=…
aufrufen können . Es gibt auch FALLOC_FL_INSERT_RANGE
und --insert-range
. Aber sie sind auf Blöcke beschränkt, was sie für Textdateien meist unbrauchbar macht, und sie sind nicht mit allen Dateisystemen verfügbar.