it-swarm.com.de

Hinzufügen neuer Zeilen bei Verwendung von Echo

Warum fügt der folgende Befehl keine neuen Zeilen in die generierte Datei ein und was ist die Lösung?

$ echo "Line 1\r\nLine2" >> readme.txt

$ cat readme.txt 
Line 1\r\nLine2
46
Saeid Yazdani

echo


Eine echo -Implementierung, die strikt der Single Unix-Spezifikation entspricht, fügt neue Zeilen hinzu, wenn Sie Folgendes tun:

echo 'line1\nline2'

Das ist aber kein verlässliches Verhalten. Tatsächlich gibt es wirklich nicht jedes Standardverhalten, das Sie von echo erwarten können.

OPERANDEN

string

Eine Zeichenfolge, die in die Standardausgabe geschrieben werden soll. Wenn der erste Operand -n Ist oder wenn einer der Operanden einen <\ Backslash> Zeichen enthält, wird das Ergebnisse sind implementierungsdefiniert.

Wenn auf XSI-konformen Systemen der erste Operand -n Ist, wird er als Zeichenfolge behandelt, keine Option. Die folgenden Zeichenfolgen müssen auf XSI-konformen Systemen innerhalb eines der Argumente erkannt werden:

\a - Schreiben Sie eine <Alarm>.

\b - Schreiben Sie ein <Rücktaste>.

\c - Unterdrücke das <newline>, das ansonsten dem letzten Argument in der Ausgabe folgt. Alle Zeichen nach \c In den Argumenten werden ignoriert.

\f - Schreiben Sie einen <Form-feed>.

\n - Schreiben Sie eine <newline>.

\r - Schreiben Sie eine <Wagenrückgabe>.

\t - Schreiben Sie ein <tab>.

\v - Schreiben Sie eine <vertical-tab>.

\\ - Schreibe ein <backslash> Zeichen.

\0num - Schreiben Sie einen 8-Bit-Wert, der die null-, eins-, zwei- oder dreistellige Oktalzahl num ist.

Es gibt also keine allgemeine Möglichkeit, eine neue Zeile mit echo zu schreiben, außer dass Sie sich im Allgemeinen darauf verlassen können, nur echo zu tun, um dies zu tun.

Eine bash - Shell entspricht normalerweise nicht der Spezifikation und behandelt die -n Und andere Optionen, aber selbst das ist ungewiss. Du kannst tun:

shopt -s xpg_echo
echo hey\\nthere

hey
there

Und nicht einmal das ist notwendig, wenn bash mit der Build-Time-Option erstellt wurde ...

--enable-xpg-echo-default

Stellen Sie sicher, dass das integrierte echo Zeichen mit Backslash-Escapezeichen erweitert, ohne dass die Option -e Erforderlich ist. Dies setzt den Standardwert der Option xpg_echo Shell auf on, wodurch der Bash echo verhalten sich eher wie die in der Single Unix-Spezifikation, Version 3, angegebene Version. Eine Beschreibung der Escape-Sequenzen, die echo erkennt, finden Sie unter Bash Builtins .


printf


Andererseits ist das Verhalten von printf im Vergleich ziemlich zahm.

[~ # ~] Begründung [~ # ~]

Das Dienstprogramm printf wurde hinzugefügt, um Funktionen bereitzustellen, die in der Vergangenheit von echo bereitgestellt wurden. Aufgrund von unüberbrückbaren Unterschieden in den verschiedenen vorhandenen Versionen von echo weist die Version jedoch nur wenige Besonderheiten auf, so dass diese neuen printf Dienstprogramm, das auf einem im Ninth Edition-System basiert.

Der Abschnitt EXTENDED DESCRIPTION entspricht fast genau der Funktion printf() im ISO C-Standard, obwohl er anhand der Dateiformatnotation in beschrieben wird XBD-Dateiformatnotation .

Es verarbeitet Formatzeichenfolgen, die seine Argumente beschreiben - was eine beliebige Anzahl von Dingen sein kann, aber für Zeichenfolgen sind es entweder %b Yte-Zeichenfolgen oder wörtliche %s Zeichenfolgen. Anders als die %f - Ormats im ersten Argument verhält es sich am ähnlichsten wie ein %b Yte-String-Argument, außer dass es das Escape-Zeichen \c Nicht verarbeitet.

printf ^%b%s$ '\n' '\n' '\t' '\t'

^
\n$^    \t$

Siehe Warum ist printf besser als echo? für mehr.


echo() printf


Sie könnten Ihre eigenen standardkonformen echo schreiben wie ...

echo(){
    printf '%b ' "[email protected]\n\c"
}

... was eigentlich immer automatisch das Richtige tun sollte.

Eigentlich nein ... Das gibt ein Literal \n Am Ende der Argumente aus, wenn das letzte Argument mit einer ungeraden Anzahl von <Backslashes> endet.

Das geht aber nicht:

echo()
    case    ${IFS- } in
    (\ *)   printf  %b\\n "$*";;
    (*)     IFS=\ $IFS
            printf  %b\\n "$*"
            IFS=${IFS#?}
    esac
43
mikeserv

Übergeben Sie das Flag -e an echo, damit maskierte Zeichen wie "\ r\n" wie folgt analysiert werden:

echo -e "Line 1\r\nLine2" >> readme.txt
29
Hayden Schiff

In allen Versionen von bash, die ich verwendet habe, können Sie einfach eine wörtliche neue Zeile entweder interaktiv oder in ein Skript in eine Zeichenfolge einfügen, vorausgesetzt, die Zeichenfolge ist ausreichend in Anführungszeichen gesetzt.

Interaktiv:

$ echo "Line one
> Line two"
Line one
Line two
$

In einem Skript:

echo "Line one
Line two"
8
Digital Trauma
echo -e "Line 1\r\nLine2" >> readme.txt

weitere Nutzungsmöglichkeiten:

man echo
4
zodo

Die Leute haben bereits angemessen geantwortet, aber ich lehne es ab, eine Welt zu akzeptieren, in der Echo jede andere Option als -n Akzeptiert.

nl='
'
echo Line 1"$nl"Line 2"$nl"Line 3
2
Staven

Wenn Sie einen Charakter haben, der nicht Teil der Nachricht ist, können Sie sed durchleiten

$ echo "Time on the next line:@$(date +"%Y-%m-%dT%T%z")" | sed -e's/@/\n/g'
Time on the next line:
2016-03-25T10:12:39-0500
1
verisimilidude

Verwenden

echo -e "line1\nline2"

Dadurch wird eine neue Zeile gedruckt.

0
Sudhir