Wie kann ich einen Zeilenumbruch in einem string in sh?
Diese
STR="Hello\nWorld"
echo $STR
produziert als Ausgabe
Hello\nWorld
statt
Hello
World
Was muss ich tun, um einen Zeilenumbruch in einem string?
Hinweis: Diese Frage ist nicht etwa echo.
Ich bin mir dessen bewusst echo -e
, aber ich bin auf der Suche nach einer Lösung, die es ermöglicht die übergabe einer Zeichenfolge (inklusive Zeilenumbruch) als argument an anderen Befehle, die nicht über eine ähnliche option zu interpretieren \n
's als Zeilenumbrüche.
InformationsquelleAutor Juan A. Navarro | 2010-06-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Lösung ist die Verwendung
$'string'
zum Beispiel:Hier ein Auszug aus der Bash manual page:
+1-nur ein Hinweis: exportieren Sie varDynamic="$varAnother1$varAnother2"$'\n'
Dies funktioniert in der Tat mit literal-strings, wie der OP fragte, schlägt jedoch fehl, sobald die Variablen ersetzt werden:
STR=$"Hello\nWorld"
einfach drucktHello\nWorld
.einfache Anführungszeichen, keine doppelten
es gibt keine Variablen in deinem Beispiel. Auch diese Methode erfordert das einfache Anführungszeichen. Schließlich gehören interpolierten Variablen, die Sie hätte zu verketten doppelten Anführungszeichen und den speziellen single-quoted strings zusammen. z.B.
H="Hello"; W="World"; STR="${H}"$'\n'"${W}"; echo "${STR}"
echo "Hallo" und "Welt" auf separaten ZeilenInformationsquelleAutor amphetamachine
Echo ist so neunziger, und so voller Gefahren, die seine Verwendung ergeben sollten core dumps nicht weniger als 4GB. Im ernst, echo-Probleme waren der Grund, warum die Unix-Standardisierung schließlich erfand die
printf
Dienstprogramm, tun, Weg mit all den Problemen.Damit man einen Zeilenumbruch in einem string:
Da! Kein SYSV-vs-BSD-echo Wahnsinn, alles wird fein säuberlich gedruckt und vollständig tragbare Unterstützung für die C-escape-Sequenzen. Jeder bitte verwenden
printf
jetzt und nie wieder sehen.$'string'
ist auch sauberer.Nur für eine mangelhafte definition von "sauber". Die
$'foo'
- syntax ist nicht gültig POSIX-syntax als 2013. Viele Muscheln beschweren.BAR=$(printf "hello\nworld\n")
nicht drucken die nachfolgende \n für michSollte es nicht; die shell-Spezifikation für Befehls-substitution sagt, dass ein oder mehrere mit Zeilenumbruch am Ende der Ausgabe gelöscht werden. Ich weiß, das ist unerwartet für mein Beispiel und bearbeitet, um eine newline printf.
Nein,
$()
angegeben ist, die POSIX als das entfernen von Sequenzen von einem oder mehreren <newline> - Zeichen am Ende der substitution.InformationsquelleAutor Jens
Was ich Tat, auf der Grundlage der anderen Antworten war
InformationsquelleAutor zvezda
Das problem ist nicht mit der shell. Das problem ist eigentlich mit der
echo
Befehl selbst, und die fehlenden doppelten Anführungszeichen um die variable interpolation. Können Sie versuchen, mitecho -e
aber das ist nicht auf allen Plattformen unterstützt, und einer der Gründeprintf
wird jetzt empfohlen, für die Portabilität.Können Sie auch versuchen, und legen Sie den Zeilenumbruch direkt in die shell-Skript (wenn es ein script ist, was du schreibst) so wie es aussieht...
beziehungsweise
InformationsquelleAutor Pace
Nur einfache alternative ist, um tatsächlich geben Sie eine neue Zeile in die variable:
Ja, das bedeutet schreiben Enter, wo erforderlich, im code.
Gibt es mehrere Entsprechungen zu einer
new line
Charakter.Aber alle diese erfordern "eine interpretation" von einigen tool (POSIX printf):
Ist und daher das Werkzeug erforderlich ist, erstellen Sie eine Zeichenfolge, die mit einem neue-Zeile:
In einigen Muscheln, die Sequenz $' ist eine spezielle shell-Erweiterung.
Funktioniert in ksh93, bash und zsh:
Natürlich, komplexere Lösungen sind auch möglich:
Oder
InformationsquelleAutor
Ich finde die
-e
flag elegant und geradlinigWenn der string die Ausgabe eines anderen Befehls, ich verwende nur Zitate
echo
.Dies ist nicht eine Antwort auf die Frage
Dieses Total wird die Frage beantwortet, die ich suchte! Danke!
Funktionierte gut für mich hier. Ich habe eine Datei zu erstellen, basierend auf dieses echo und es erzeugt neue Linien auf die Ausgabe korrekt.
echo -e
ist berüchtigt für seine Portabilität Probleme. Dies ist weniger ein Wild-West-situation jetzt als pre-POSIX, aber es gibt noch keinen Grund zu bevorzugenecho -e
. Siehe auch stackoverflow.com/questions/11530203/...InformationsquelleAutor Simon Ndunda
$ Recht vor einzelne Anführungszeichen '...\n...' wie folgt, jedoch in doppelte Anführungszeichen funktioniert nicht.
InformationsquelleAutor caot
Ich bin kein bash-Experte, aber diese funktionierte für mich:
Fand ich das einfacher, die Formatierung der Texte.
InformationsquelleAutor Jason
Auf meinem system (Ubuntu 17.10) dein Beispiel funktioniert wie gewünscht, sowohl, wenn eingegeben von der Befehlszeile aus (in
sh
) und bei der Ausführung alssh
Skript:Ich denke, das beantwortet deine Frage: es funktioniert einfach. (Ich habe nicht versucht, um herauszufinden, details wie, in welchem moment genau die substitution, die das Zeilenende-Zeichen für
\n
passiert insh
).Allerdings ist mir aufgefallen, dass dieses Skript würde sich anders Verhalten, wenn Sie ausgeführt mit
bash
und DruckeHello\nWorld
statt:Habe ich es geschafft, um die gewünschte Ausgabe mit
bash
wie folgt:Hinweis: die doppelten Anführungszeichen um
$STR
. Diese verhält sich identisch, wenn gespeichert und die Ausführung alsbash
Skript.Folgende gibt auch die gewünschte Ausgabe:
InformationsquelleAutor Alexey
Diejenigen, die wählerisch sind diejenigen, die brauchen nur die neue Zeile und verachten die multiline-code, der unterbrochen Einrückungen, Sie könnte tun:
Bash (und wahrscheinlich auch anderen shells) fressen alle nachfolgende Zeilenumbrüche nach Substitutionen, so musst du am Ende der
printf
string mit einem nicht-newline-Zeichen und löschen es danach. Dies kann auch leicht zu einem oneliner.InformationsquelleAutor tlwhitec
Ich war nicht wirklich glücklich mit einer der Optionen hier. Das ist was für mich gearbeitet.
str=$(printf '%s\n' "first line" "another line" "and another line")
(die Hülle wird bequem (oder nicht), trim keine abschließende newlines aus dem Kommando-substitution). Einige Antworten hier schon fördernprintf
in verschiedenen Formen, also ich bin mir nicht sicher, ob dies fügt jeden Wert als eine separate Antwort.Es ist für kurze strings, aber wenn Sie wollen, um Ordnung zu halten und jede Zeile ist tatsächlich 60 Zeichen lang ist, dann ist es ein ordentlicher Weg, es zu tun. Angesichts der Tatsache, daß die Lösung, die ich schließlich ging, es tut sich etwas hinzu, wenn nicht für Sie, dann für mich in Zukunft, wenn ich zweifellos zurück.
Auch bei langen strings, die ich lieber
printf '%s\n' "first line" \
(Zeilenumbruch, Einrückung)'second line'
etc. Siehe auchprintf -v str
für die Zuweisung an eine variable ohne Laich einer subshell.InformationsquelleAutor Adam K Dean