Ich möchte einige n Zeilen vom Ende einer Datei entfernen . Kann das mit sed gemacht werden?
Zum Beispiel, um Zeilen von 2 bis 4 zu entfernen, kann ich verwenden
$ sed '2,4d' file
Aber ich kenne die Zeilennummern nicht. Ich kann die letzte Zeile mit löschen
$sed $d file
aber ich möchte wissen, wie man n Zeilen vom Ende entfernt. Bitte lassen Sie mich wissen, wie das mit sed oder einer anderen Methode gemacht wird.
sed
?sed $d file
gibt einen Fehler zurück. Stattdessen sollte $ d in Anführungszeichen wiesed '$d' file
Antworten:
Ich weiß nicht
sed
, aber es kann getan werden mithead
:quelle
sed -e :a -e '$d;N;2,5ba' -e 'P;D' file
(,5
für die letzten 5 Zeilen).head
, aber nicht Standard ist. In der Tat der Standard fürhead
Staaten:The application shall ensure that the number option-argument is a positive decimal integer.
head: illegal line count -- -2
Wenn die Hardcodierung von n eine Option ist, können Sie sequenzielle Aufrufe von sed verwenden. Um beispielsweise die letzten drei Zeilen zu löschen, löschen Sie die letzte Zeile dreimal:
quelle
Von den sed Einzeiler :
Scheint das zu sein, wonach du suchst.
quelle
10
in'$d;N;2,10ba'
Eine lustige und einfache
sed
undtac
Lösung:HINWEIS
"
Für die Shell sind doppelte Anführungszeichen erforderlich, um die$n
Variable imsed
Befehl auszuwerten . In einfachen Anführungszeichen wird keine Interpolation durchgeführt.tac
ist einecat
umgekehrte, sieheman 1 tac
{}
insed
sind da, um$n
& zu trennend
(wenn nicht, versucht die Shell, nicht existierende$nd
Variablen zu interpolieren )quelle
tac
on osxport info coreutils
||brew info coreutils
;;Verwenden Sie
sed
, aber lassen Sie die Shell rechnen, mit dem Ziel, dend
Befehl zu verwenden, indem Sie einen Bereich angeben (um die letzten 23 Zeilen zu entfernen):So entfernen Sie die letzten 3 Zeilen von innen nach außen:
Gibt die Anzahl der Zeilen der Datei an: sagen wir 2196
Wir wollen die letzten 23 Zeilen entfernen, also für die linke Seite oder den Bereich:
Gives: 2174 Somit lautet das ursprüngliche Sed nach der Shell-Interpretation:
Mit
-i
der Inplace-Bearbeitung hat die Datei jetzt 2173 Zeilen!Wenn Sie es in einer neuen Datei speichern möchten, lautet der Code:
quelle
Sie könnten Kopf dafür verwenden.
Verwenden
$ head --lines=-N file > new_file
Dabei ist N die Anzahl der Zeilen, die Sie aus der Datei entfernen möchten.
Der Inhalt der Originaldatei abzüglich der letzten N Zeilen befindet sich jetzt in new_file
quelle
Der Vollständigkeit halber möchte ich meine Lösung hinzufügen. Am Ende habe ich das mit dem Standard gemacht
ed
:Dies löscht die letzten 2 Zeilen in-Place - Bearbeitung mit (auch wenn es nicht eine temporäre Datei in verwenden
/tmp
!!)quelle
Um sehr große Dateien wirklich direkt abzuschneiden, haben wir den
truncate
Befehl. Es weiß nichts über Zeilen, abertail
+wc
kann Zeilen in Bytes konvertieren:Es gibt eine offensichtliche Racebedingung, wenn die Datei gleichzeitig geschrieben wird. In diesem Fall ist es möglicherweise besser zu verwenden
head
- es zählt die Bytes ab dem Dateianfang (Mind Disk IO), sodass wir immer an der Zeilengrenze abschneiden (möglicherweise mehr Zeilen als erwartet, wenn die Datei aktiv geschrieben wird):Praktischer Einzeiler, wenn Sie sich nicht anmelden können. Versuchen Sie, anstelle des Benutzernamens ein Passwort einzugeben:
quelle
Dies könnte für Sie funktionieren (GNU sed):
quelle
'
) verpasst .d
,D
oderP
mit GNU sed und nicht auf Posix - Version. Scheint, als würden Zeilen nach dem nicht gedrucktD
und bleiben für eine neue Schleife im Arbeitspuffer, ohne zum "Ende" der Aktionszeile zu gelangen.D
der gegenteilige Effekt erzielt wurde .Die meisten der oben genannten Antworten scheinen GNU-Befehle / -Erweiterungen zu erfordern:
Für eine etwas tragbarere Lösung:
ODER
ODER
Wobei "10" "n" ist.
quelle
Mit den Antworten hier hätten Sie bereits gelernt, dass sed nicht das beste Werkzeug für diese Anwendung ist.
Ich denke jedoch, dass es eine Möglichkeit gibt, dies mit sed zu tun. Die Idee ist, N Zeilen anzuhängen, um Platz zu halten, bis Sie lesen können, ohne EOF zu treffen. Wenn EOF gedrückt wird, drucken Sie den Inhalt des Haltebereichs und beenden Sie ihn.
Mit dem obigen Befehl sed werden die letzten 5 Zeilen weggelassen.
quelle
Versuchen Sie den folgenden Befehl:
quelle
=
.tail -r
wo andere die Zeilenreihenfolgetac
umgekehrt haben, und macht die letztenn
Zeilen zu denn
ersten Zeilen.Dies kann in 3 Schritten erfolgen:
a) Zählen Sie die Anzahl der Zeilen in der Datei, die Sie bearbeiten möchten:
b) Subtrahieren Sie von dieser Zahl die Anzahl der zu löschenden Zeilen:
c) Sagen Sie sed, dass es
$x
bis zum Ende von dieser Zeilennummer ( ) löschen soll :quelle
sed
, um die Zeilen 7 bis 10 zu löschen, dh 4 Zeilen, nicht 3.Sie können die Gesamtzahl der Zeilen mit
wc -l <file>
und verwendenhead -n <total lines - lines to remove> <file>
quelle
Dadurch werden die letzten 3 Zeilen entfernt von
file
:for i in $(seq 1 3); do sed -i '$d' file; done;
quelle
sed
.Ich bevorzuge diese Lösung;
Dabei ist N die Anzahl der zu entfernenden Zeilen.
quelle
Posix-Version
quelle
So löschen Sie die letzten 4 Zeilen:
quelle
tac file | sed '1,4d' | tac
weil das Sortieren und Entfernen des Präfixes viele Ressourcen kostet.tac
Befehl für einige Systeme (zum Beispiel FreeBSD?)Ich habe mir das ausgedacht, wobei n die Anzahl der Zeilen ist, die Sie löschen möchten:
Es ist ein kleiner Kreisverkehr, aber ich denke, es ist leicht zu folgen.
quelle
Zum Löschen der letzten N Zeilen einer Datei können Sie dasselbe Konzept von verwenden
Sie können eine Kombination mit dem Befehl tail verwenden, um die Datei umzukehren: wenn N 5 ist
Und dieser Weg läuft auch dort, wo der
head -n -5 file
Befehl nicht läuft (wie auf einem Mac!).quelle
Dadurch werden die letzten 12 Zeilen entfernt
quelle