Wenn ich eine Zeichenfolge mit nicht druckbaren Zeichen, neuen Zeilen oder Tabulatoren habe, gibt es eine Möglichkeit echo
, diese Zeichenfolge zu drucken und Codes für diese Zeichen anzuzeigen (z. B. \n
für neue Zeilen, \b
für die Rücktaste)?
13
e- ohce
* rimshot *printf '%q' "$str"
druckt die entkoppelte Zeichenfolge. Ich füge dies nicht als Antwort hinzu, da es nicht die gleiche Form des Fluchtens ist, dieecho -e
verwendet wird - es soll vielmehr auswertungssicher sein -, aber (1) es ist gut genug, wenn Ihr Ziel die menschliche Lesbarkeit ist, (2) es ist Gut genug, wenn Ihr Ziel die sichere Shell-Generierung ist und (3) aufecho -e
jeden Fall Evil And Wrong ist (wenn Sie die POSIX-Spezifikation lesen, werden Sie feststellen, dass printf die bevorzugte Methode für die Formatierung von Zeichenfolgen ist undecho -e
von POSIX unter nicht garantiert wird alle).Antworten:
Es gibt viele Möglichkeiten, dies zu tun. Die tragbarsten zwei, die ich kenne, sind
sed
undod
- sie sind beide POSIX.Es mag ...
read
Stil entkommt - C-Stil.AUSGABE
od
ist etwas konfigurierbarer ...Wenn Sie wissen
man od
möchten , welche dieser Optionen Sie verwenden können, geben Sie an , dass Sie zwei Arten von Escape- Zeichen verwenden möchten: das-t c
Backslash-Escape--t a
Zeichen und die benannten Zeichen. Die-w
oben verwendete Option ist nicht POSIX-spezifiert.Und hier ist eine kleine Shell-Funktion, die portabel die Oktalwerte jedes Bytes in seinen Argumenten ausgibt - was natürlich auch mit
od
Folgendem umgehen könnte-t o
:Das ist ganz einfach. Das ist etwas komplizierter. Es sollte jedoch in der Lage sein, das zu tun, was die Shell-spezifischen
printf -q
Implementierungen können.Beispielstring von früher mit ein wenig zusätzlichem verwenden:
AUSGABE
Es ist nur ein bisschen anders. Sie werden vielleicht feststellen, dass es einen zusätzlichen
0
und einen zusätzlichen\b
Schrägstrich gibt. Dies soll eine einfache Übersetzung in einread
oder mehrere%b
printf
Argumente ermöglichen. Beispielsweise:AUSGABE
quelle
proctal
?bsq()
- fehlt etwas? Ich frage, weil ich nicht ganz sicher bin, was die Backslashes angeht.Wenn Sie den
-e
Schalter aufecho
, inbash
und entfernen , sofern diexpg_echo
Option nicht aktiviert wurde, sollten die Zeichenfolgen nur als Originaltext gedruckt werden. Also\n
und\t
würde sich so buchstäblich zeigen.Beispiel
Sie können auch die Verwendung
printf
integrierten Befehl vonksh93
,zsh
oderbash
dies auch finagle.(
Auszug ausbash
Ausgabe wie oben gezeigt. Je nach Shell gibt es einige Abweichungen.)help printf
inbash
quelle
printf %q
das Abschneiden der abschließenden\n
s, sondern die$()
Ausgabeerfassung, die sie entfernt.printf
jeden Fall ist es dumm, in einer Subshell zu laufen, um deren Ausgabe zu erfassen, daprintf -v varname
die Ausgabe direkt in eine Variable verschoben wird, ohne dass eine Subshell betroffen ist.printf
in einer Subshell aktiv, ich warecho
in einer aktiv, nur um zu demonstrieren, dass Sie die Sonderzeichenausgabe vonecho
und zurück in die maskierte Notation konvertieren können.Sie könnten etwas verwenden,
Nun könnten Sie so etwas tun,
Ausgabe
Ein weiteres allgemeines Testen ohne Dateien ist wie folgt:
Der obige Befehl liefert die Ausgabe als
Verweise
quelle
Mit
zsh
gibt es die(q)
,(qq)
,(qqq)
,(qqqq)
variable Expansion Flags, die können zitieren die Variablen auf verschiedene Weise:In Ihrem Fall möchten Sie wahrscheinlich eine der letzten beiden.
quelle
od -c
Normalerweise werden normale Zeichen gedruckt, Sonderzeichen (Tabulator, Zeilenvorschub usw.) und nicht druckbare Zeichen alsprintf
Escape-Code.So:
Das
-An
sagtod
, die Adresse nicht auszugeben.quelle
Verwenden Sie den
printf
Befehl. Beispielsweise:printf "Hello\nthis is my line
wird ausgegeben
quelle
echo -e
, ich suche das Gegenteil .