Antworten:
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
:
sed -zE 's/(\n[^\n]*){3}$/\nNew-line&/' infile
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):
3*\n
4\n
5\n*
Portabilität würden Sie verwenden:
sed -e ':t;N;$!bt; s/\(\n[^\n]*\)\{2\}$/\nNew-line&/' infile
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:
sed -e ':t;N;$!bt; s/\(\n[^\n]*\)\{2\}$/\
New-line&/' infile
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.
NEW_LINE
vor der Verwendung desinfiziert werden.
Es kann einfach gemacht werden head
und tail
:
$ output=$(head -n -2 file ; echo 'new line' ; tail -2 file)
$ echo "$output" > file
Wie in den Kommentaren erwähnt, frisst es alle nachgestellten Leerzeilen. Um nachgestellte Leerzeilen beizubehalten,
$ head -n -2 file >> file.tmp
$ echo 'new line' >> file.tmp
$ tail -2 file >> file.tmp
$ mv file.tmp file
oder Single Liner
$ head -n -2 file >> file.tmp ; echo 'new line' >> file.tmp; tail -2 file >> file.tmp ; mv file.tmp file
$(...)
funktioniert von selbst einwandfrei. Ist es also die Zuweisung?
Das Folgende awk
könnte auch helfen.
awk -v line=$(wc -l < Input_file) -v val="new_line" 'FNR==(line-1){print val} 1' Input_file
sed -e '
1N
$!{N;P;D;}
H;g;s/^/NEW_LINE/
' input-data.txt
sed
tac input.txt | sed '2 a New line' | tac
Erläuterung
tac
- druckt Zeilen in umgekehrter Reihenfolge, sodass die letzte Zeile die erste, die last - 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
$ tac <(seq 1 5) | sed '2 a New line' | tac
1
2
3
New line
4
5