Interessante Frage. Wie bereits erwähnt, ist die ganze Geschichte für sed, um mehrzeiligen Text in eine andere Datei einfügen zu können, dass dieser neue mehrzeilige Text tatsächlich literal \n
für Zeilenumbrüche haben muss.
So können wir sed verwenden echte neue Zeile Zeichen zu wörtlichen \n
zu konvertieren:
$ a=$(tr '\n' '\\' <file3 |sed 's#[\]$##' |sed "s#[\]#\0n#g")
#Alternative: a=$(sed "s#[\]#\0n#g" <(sed 's#[\]$##' <(tr '\n' '\\' <file3)))
$ echo "$a"
apples\noranges\nbananas\ncarrots
Wie diese Übersetzung funktioniert:
* Zuerst haben wir alle neue Linien mit einem einzigen Backslash ersetzen mit tr
* Dann wir entfernen den umgekehrten Schrägstrich vom Ende des Strings
* Dann ersetzen wir alle anderen Backslashes mit Backaslash und n Char.
Da nun variable $a
enthält wörtliche \n
zwischen den Zeilen, sed wird sie zurück in Actuall neue Linien übersetzen:
$ cat file4
Line1
line2
line3
$ sed "2i $a" file4
Line1
apples
oranges
bananas
carrots
line2
line3
Ergebnis:
Mutliline Ersatz kann mit zwei Befehle erfolgen:
$ a=$(tr '\n' '\\' <file3 |sed 's#[\]$##' |sed "s#[\]#\0n#g")
$ sed "2i $a" file4
sed 2i
bedeutet einen Text vor Zeile2 einfügen. 2a
kann verwendet werden, um etwas nach Zeile2 einzufügen.
Bemerkung:
Nach this post, die ein Duplikat zu sein scheinen, die Übersetzung von neuen Linien zu wörtlichen \ n scheint, dass mit nur geschehen:
a=$(echo ${a} | tr '\n' "\\n")
Aber diese Methode nie in meinem System gearbeitet.
Remark2:
Der sed Betrieb sed "2i $a"
= Variable $ a einsetzen, bevor Zeile 2 kann auch mit den gleichen Zeichen \0
zuzüglich einer neuen Zeile \n
sowie den Inhalt der Variablen $a
als sed "1 s/.*/\0\n$a/"
= ersetzen alle Zeichen der ersten Zeile ausgedrückt werden => füge $ a nach Zeile1 ein = füge $ a vor Zeile2 ein.
können Sie vollständige Eingabe/Ausgabe hinzufügen? 'TEST' hat mehrere Zeilen, und Sie fügen eine Zeichenfolge davor und danach hinzu ... daher ist es für mich etwas unklar, ... einfach Inhalte aus einer Datei einzufügen, verwenden Sie den' r' Befehl ... 'sed ' 14r foo 'target' -> fügt den Inhalt der Datei foo ab der 15. Zeile in das Ziel der Eingabedatei ein – Sundeep