Wie füge ich ein Newline-Sonderzeichen mit dem Befehl echo und dem Umleitungsoperator in eine Datei ein?

29

Ich möchte eine Datei mit dem Befehl echo und dem Umleitungsoperator erstellen. Die Datei sollte aus wenigen Zeilen bestehen.

Ich habe versucht, eine neue Zeile mit "\ n" in die Zeichenfolge aufzunehmen:

echo "first line\nsecond line\nthirdline\n" > foo

Auf diese Weise wird jedoch keine Datei mit drei Zeilen erstellt, sondern eine Datei mit nur einer Zeile und dem wörtlichen Inhalt der Zeichenfolge.

Wie kann ich mit diesem Befehl eine Datei mit mehreren Zeilen erstellen?

Abdul Al Hazred
quelle

Antworten:

30

Sie haben nach einer Syntax für den echoBefehl gefragt :

echo $'first line\nsecond line\nthirdline' > foo

(Beachten Sie auch die andere Antwort, die Sie erhalten haben.)

Das $'...'Konstrukt erweitert eingebettete ANSI-Escape-Sequenzen.

Janis
quelle
1
Beachten Sie, dass dies kein POSIX ist. Ob es verfügbar ist, hängt weitgehend davon ab, welche Shell Sie verwenden.
Chris Down
1
Sie finden dieses Konstrukt in den prominenten Shells (zumindest), ksh, bash, zsh (und vielleicht anderen).
Janis
1
@ChrisDown, es ist noch nicht POSIX, aber für die Aufnahme in Ausgabe 8 geplant. Ksh93, bash, zsh, mksh, FreeBSD sh unterstützen es.
Stéphane Chazelas
24

Was das Echo mit der Zeichenflucht macht, ist in der Implementierung definiert. In vielen Implementierungen von Echo (einschließlich der modernsten) wird die übergebene Zeichenfolge standardmäßig nicht auf Escape-Zeichen überprüft.

Mit dem von GNU bash (als eingebautes Element) bereitgestellten Echo und einigen anderen Echo-Varianten können Sie Folgendes tun:

echo -en 'first line\nsecond line\nthird line\n' > file

Es hört sich jedoch wirklich so an, wie Sie es möchten printf, was für mich besser lesbar und auch portabler ist (dieses Feature ist in POSIX definiert):

printf '%s\n' 'first line' 'second line' 'third line' > file

Sie können auch ein Dokument hier verwenden :

cat > file << 'EOF'
first line
second line
third line
EOF
Chris Down
quelle
Ich habe versucht , Ihre Katze> Datei << ‚EOF‘ in der Shell ein , wenn ich die Eingabetaste drücken, ich habe diesen> förmige prompt mit jeder Zeile, aber ich kann nicht einmal davon bekommen, indem ctrl Schlagen + x oder Strg + z
Abdul Al Hazred
Sie müssen EOF alleine in eine Eingabezeile
eingeben
2
@mikeserv Bist du witzig oder ernst?
Matthew Read
1
@AbdulAlHazred wie der Link in der Antwort angibt, wird es "hier Dokument" genannt und ist sehr verbreitet. Wikipedia ist gut zu diesem Thema: en.wikipedia.org/wiki/Here_document .
Dave_thompson_085
1
Dies funktionierte für meinen Mac OSX (speziell echo -en 'text..', während die akzeptierte Antwort mein Newline-Zeichen ( \n) nicht erkannte , echo -entat das.
Benjamin
4

Hier sind einige andere Möglichkeiten zum Erstellen einer mehrzeiligen Datei mit dem echoBefehl:

echo "first line"  >  foo
echo "second line" >> foo
echo "third line"  >> foo

Wobei der zweite und dritte >>Befehl den Umleitungsoperator verwenden, wodurch die Ausgabe des Befehls an die Datei angehängt (hinzugefügt) wird (die zu diesem Zeitpunkt bereits vorhanden sein sollte).

Oder

(echo "first line"; echo "second line"; echo "third line") > foo

Dabei gruppieren die Klammern die echoBefehle in einem Unterprozess, der aussieht und sich wie ein einzelnes Programm verhält, das mehrere Zeilen ausgibt (wie lszum Beispiel).

Eine subtile Variation des oben genannten ist

{ echo "first line"; echo "second line"; echo "third line";} > foo

Dies ist etwas effizienter als die zweite Antwort, da kein Unterprozess erstellt wird. Die Syntax ist jedoch etwas kniffliger: Beachten Sie, dass Sie nach dem ein Leerzeichen {und vor dem ein Semikolon einfügen müssen }.

Siehe Was sind die Steuerungs- und Umleitungsoperatoren der Shell? für mehr Informationen.

Scott
quelle
2

Um noch eine weitere Option Enter anzugeben , können Sie einfach auf (dh einen wörtlichen Zeilenumbruch) klicken:

$ echo "the rain in spain
> falls mainly on the plain" > foo

Beachten Sie, dass Sie das >am Anfang der zweiten Zeile nicht eingeben . Dies ist die sekundäre Shell-Eingabeaufforderung, $PS2die die Shell ausgibt, wenn Sie einen unvollständigen Befehl eingeben (z. B. in diesem Fall einen Befehl mit einem nicht übereinstimmenden Anführungszeichen).

Gartenkopf
quelle
0

POSIX 7 sagt, dass Sie nicht können

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

-e ist nicht definiert und Backslashes sind implementiert:

Wenn der erste Operand -n ist oder wenn einer der Operanden einen <Backslash> -Zeichen enthält, sind die Ergebnisse implementierungsdefiniert.

es sei denn, Sie haben eine optionale XSI-Erweiterung.

Also benutze printfstattdessen:

Der Formatoperand wird als Formatzeichenfolge verwendet, die in der XBD-Dateiformatnotation [...] beschrieben ist.

die Dateiformatnotation :

\ n <neue Zeile> Verschiebt die Druckposition an den Anfang der nächsten Zeile.

Beachten Sie auch, dass Ubuntu 15.10 und die meisten Distributionen echobeides implementieren :

  • eine eingebaute Bash: help echo
  • eine eigenständige ausführbare Datei: which echo

was zu Verwirrung führen kann.

Ciro Santilli ist ein Schauspieler
quelle
echoIn jeder Shell, die auf dem System verfügbar ist , ist eine integrierte Shell vorhanden. Unter Ubuntu / bin / sh ist Bash in der Regel ebenfalls standardmäßig enthalten. zsh, rc, mksh, yash, csh, tcsh, ksh93 ... haben alle ein eigenes Echo mit unterschiedlichem Verhalten. Beachten Sie, dass which echoder Pfad des Systemechos nicht in allen Shells angezeigt wird.
Stéphane Chazelas
@ StéphaneChazelas "Welches Echo gibt Ihnen nicht den Pfad des Systemechos in allen Shells." Dass ich nicht wusste, was könnte es noch geben?
Ciro Santilli
Versuchen Sie es in tcsh oder zsh. whichwar ursprünglich (in den 80ern) ein csh-script nur für csh-benutzer (lud die aliasnamen von ~ / .cshrc) und ist immer noch auf einigen systemen. whichist in zsh und tcsh eingebaut.
Stéphane Chazelas