Gibt es einen Befehl, mit dem ich die letzten n Zeilen in einer Datei bearbeiten kann? Ich habe mehrere Dateien, die alle eine unterschiedliche Anzahl von Zeilen enthalten. Aber ich möchte die letzten n Zeilen in jeder Datei ändern. Ziel ist es, Kommas in den letzten n Zeilen durch Semikolons zu ersetzen. Aber nur in den letzten n Zeilen.
Ich möchte keine Zeilen löschen, sondern nur jedes Komma durch ein Semikolon in den letzten n Zeilen jeder Datei ersetzen.
Mit dem Befehl sed kann ich die allerletzte Zeile durch diesen Befehl ersetzen. Wie hier beschrieben: Wie kann ich Text in der letzten Zeile einer Datei entfernen?
Dies ermöglicht mir jedoch nur, die allerletzte Zeile und nicht die letzte n Anzahl von Zeilen zu ändern.
text-processing
awk
sed
sku2003
quelle
quelle
sed '24,$s/,/:/g' filename
wo24
ist die Startlinie?Antworten:
So ersetzen Sie Kommas durch Semikolons in den letzten n Zeilen durch
ed
:Das aufteilen:
ed -s
= still ausgeführt (melden Sie nicht die am Ende geschriebenen Bytes)'$-'
= vom Ende der Datei ($
) minus ...$((n-1))
= n-1 Zeilen ...$' ... '
= zitiere den Rest des Befehls, um ihn vor der Shell zu schützen),$s/,/;/g
= ... bis zum Ende der Datei (,$
) suchen und alle Kommas durch Semikolons ersetzen.\nwq
= Beenden Sie den vorherigen Befehl, speichern Sie ihn und beenden Sie ihnSo ersetzen Sie Kommas durch Semikolons in den letzten n Zeilen durch
sed
:Das auseinander brechen:
-i
= bearbeite die Datei "an Ort und Stelle"$(( ... ))
= rechne nach:$( wc -l < input)
= Anzahl der Zeilen in der Datei ermitteln-n + 1
= gehe n-1 Zeilen rückwärts,\$
= von n-1 Zeilen bis zum Ende der Datei:s/,/;/g
= Ersetzen Sie die Kommas durch Semikolons.quelle
wc -l < input
mitwc -l input
. Sollte um ein paar Nanosekunden schneller sein :)wc -l input
der Dateiname ausgegeben wird; wir wollen nur die ZeilenanzahlLösung mit tac und sed , um jedes Komma in den letzten 50 Zeilen von file.txt durch ein Semikolon zu ersetzen:
quelle
Mit GNU
head
und einer Bourne-ähnlichen Hülle:Wir überschreiben die Datei über sich selbst. Das ist in Ordnung hier für eine Byte-zu-Byte - Umschrift , aber nicht notwendigerweise , wenn die Änderung bedeutet die Größe der Datei zu ändern (in diesem Fall würden Sie ersetzen mögen
1<> file
mit> other-file && mv other-file file
zum Beispiel).quelle
1<>
, mit denen ich nicht vertraut war. Auchsponge
aus moreutils ist ein gutes Werkzeug für Rohrleitungen , wo Sie wollen Ihre Eingaben zu überschreiben.Nehmen wir an, wir möchten die letzten
7
Zeilen der folgenden Sequenz durch ein Shell-Skript und eine GNU-Implementierung von ersetzensed
:Schritt 1 : Lassen Sie uns die letzte Zeilennummer der Sequenz wie folgt abrufen. Schauen Sie sich dies und das an :
Schritt 2 : Legen Sie die Anzahl der Zeilen (am Ende der Sequenz) fest, die wir bearbeiten möchten:
Schritt 3 : Lassen Sie uns die Startlinie basierend auf vorherigen Variablen wie folgt berechnen. Schauen Sie sich auf diese :
Schritt 4 : Jetzt können wir die letzten 7 Zeilen der Sequenz durch etwas anderes ersetzen, wie das folgende. Schauen Sie sich auf diese :
In Schritt 4 wird Abschnitt 4.4 der sed-Manpage verwendet, in dem Folgendes angegeben ist:
In Schritt 4 werden auch doppelte Anführungszeichen verwendet, wie hier erwähnt .
Nun, die 4 Schritte sind unnötig, wenn wir die Antwort von Gohu so verwenden:
quelle
Verwenden Sie
tail
und leiten Sie zu sed:tail -n 20 file | sed 's/,/;/g'
Dies funktioniert in der Datei für die letzten 20 Zeilen. Wenn Sie möchten, dass Sie direkt in die Datei wechseln, verwenden Sie:
tail -n 20 file | sed -i 's/,/;/g'
quelle