Ich möchte eine neue Zeile in zwei Zeilen vor der letzten Zeile einfügen. Also, wenn meine Originaldatei ist:
1
2
3
4
5
Das Ergebnis sollte sein
1
2
3
New line
4
5
quelle
Ich möchte eine neue Zeile in zwei Zeilen vor der letzten Zeile einfügen. Also, wenn meine Originaldatei ist:
1
2
3
4
5
Das Ergebnis sollte sein
1
2
3
New line
4
5
Verwenden von ed
:
$ printf '$-1i\nNew line\n.\n,p\n' | ed -s file
1
2
3
New line
4
5
Das ed
Bearbeitungsskript:
$-1i
New line
.
,p
Dies bewegt sich zuerst in die Zeile eine Zeile vor dem Ende ( $-1
) und fügt ( i
) neuen Inhalt über dieser Zeile ein. Der eingefügte Inhalt wird mit einem einzelnen Punkt beendet (es dürfen mehrere Zeilen sein). Der letzte ,p
zeigt den vollständig geänderten Puffer auf dem Terminal an.
Sie können dies in eine neue Datei umleiten oder mit in die Originaldatei zurückschreiben
printf '$-1i\nNew line\n.\nw\n' | ed -s file
(das ,p
wird geändert in w
).
Letzteres würden Sie auch in ähnlicher Weise ex
für diesen Job verwenden:
printf '$-1i\nNew line\n.\nw\n' | ex -s file
ed
und ex
sind standardmäßige zeilenorientierte Editoren (im Gegensatz zu Vollbild-Editoren), die mit Ihrem System geliefert werden sollten. Beachten Sie, dass -s
dies jeweils unterschiedliche Bedeutungen hat, jedoch für beide geeignet ist, wenn Sie solche Aufgaben im Batch-Modus bearbeiten.
ed
. "Shell und Dienstprogramme". Basisspezifikationen . IEEE 1003.1: 2017. Die offene Gruppe.ex
. "Shell und Dienstprogramme". Basisspezifikationen . IEEE 1003.1: 2017. Die offene Gruppe.Weiterführende Literatur:
Sie können auch GNU verwenden
sed
:Fügen Sie eine Zeile
New-line
in die drittletzte Zeile der Datei ein (Fügen Sie eine Zeile zwei Zeilen vor der letzten Zeile ein).Diese
(\n[^\n]*){3}$
Begegnungen\n
ewline durch irgendetwas gefolgt , aber nicht ein\n
ewline und maximal 3 mal von Ende der Datei , in der-z
Option Gehäuse sed eine Datei als eine einzige Zeile (separate Leitungen von NUL - Zeichen) zu lesen. Es wird also nur unten übereinstimmen (zwischen den von mir hervorgehobenen Sternchen):Portabilität würden Sie verwenden:
Wenn Sie
sed
eine\n
Ewline im Ersatzteil immer noch nicht verarbeiten können , können Sie eine aktuelle Newline haben oder Ctrl+ drücken, Vgefolgt von Enterden^M
Steuerzeichen der Eingabetaste:Wie es funktioniert
Das
N
Anfügen jede Zeile sed den Musterraum lesen , gefolgt von einer neuen Zeile hinzugefügt , bis alle Zeilen lesen. Das:t
definiert ein Label und$!bt
sagt sed, springe zum aufgerufenen Label,t
solange es nicht das Ende der Datei ist.quelle
NEW_LINE
vor der Verwendung desinfiziert werden.Es kann einfach gemacht werden
head
undtail
:Wie in den Kommentaren erwähnt, frisst es alle nachgestellten Leerzeilen. Um nachgestellte Leerzeilen beizubehalten,
oder Single Liner
quelle
$(...)
funktioniert von selbst einwandfrei. Ist es also die Zuweisung?Das Folgende
awk
könnte auch helfen.quelle
Dieser sollte gegenüber dem Inhalt der eingefügten Zeile recht robust sein, erfordert jedoch, dass die Datei zweimal gescannt wird (
wc
für den ersten Durchgang).quelle
Wie es funktioniert
sed
quelle
Erläuterung
tac
- druckt Zeilen in umgekehrter Reihenfolge, sodass die letzte Zeile die erste, dielast - 1
Zeile die zweite usw. wird.sed '2 a New line
-New line
Nach der zweiten Zeile anhängen .tac
- kehrt die Zeilen wieder um.Testen
quelle