Ich habe eine Datei mit ANSI-Farben.
test.txt:
\e[0;31mExample\e[0m
Ich möchte den Inhalt dieser Datei wie in einem Terminal cat
anzeigen, aber ich möchte auch die Farben anzeigen.
cat
druckt du ?
echo -e $(cat test.txt)
.
Ich habe eine Datei mit ANSI-Farben.
test.txt:
\e[0;31mExample\e[0m
Ich möchte den Inhalt dieser Datei wie in einem Terminal cat
anzeigen, aber ich möchte auch die Farben anzeigen.
cat
druckt du ?
echo -e $(cat test.txt)
.
Antworten:
Ich suchte nach einer Lösung für genau diese Bash-Frage. Ich habe fast den Kommentar von @Thomas Dickey verpasst, der mir die eleganteste Lösung lieferte.
echo -e $(cat test.txt)
Einige Dinge, die bei mir nicht funktioniert haben, sind (anscheinend kann man keine Dinge zum Echo leiten)
cat test.txt | echo -e
oder
less -R test.txt
Ein weiteres Problem, das ich hatte, war, dass echo -e keine Zeilenumbrüche und zusammenhängenden Leerzeichen in der Datei druckte. Um diese zu drucken, habe ich Folgendes verwendet.
echo -ne $(cat test.txt | sed 's/$/\\n/' | sed 's/ /\\a /g')
Dies funktioniert für eine test.txt-Datei, die enthält
\e[0;31mExa mple\e[0m
\e[0;31mExample line2\e[0m
\a
klingelt aber für mich. Ich habe Ihren zweiten sed-Befehl geändert, auf sed 's/ /\\033\\a /g'
den nicht geklingelt wird.
$(cat file.txt)
doppelte Anführungszeichen einzugeben und am Ende eine neue Zeile hinzuzufügen - keine Notwendigkeit für sed - also: echo -ne "$(<file.txt)" \\n
oder echo -ne "$(cat <<"EOF" . . . EOF)" \\n
. Dies verhindert auch, dass bash eine Glob-Erweiterung im Text ausführt.
Wenn Sie keine Farbe sehen, sind cat
die Steuerzeichen wahrscheinlich nicht intakt.
Einige Tools entfernen Steuerzeichen, lassen sie jedoch am hinteren Ende.
Vergleichen Sie:
echo -e "\e[0;31mExample\e[0m foo"
zu
echo -e "[0;31mExample[0m foo"
Möglicherweise können Sie die Steuerungssequenz aus den verbleibenden Elementen neu erstellen, obwohl dies nicht narrensicher ist, da der von Ihnen verwendete reguläre Ausdruck möglicherweise versehentlich unbeabsichtigte Zeichenfolgen usw. abruft. Aber zum Beispiel:
echo -e "[0;31mExample[0m foo" | sed "s:\[\([0-9]*[;m]\):^[[\1:g"
würde die Farbe der Beispielzeichenfolge wiederherstellen.
Es sollte standardmäßig funktionieren. ZB wenn ich das tue ls --color=always > /tmp/a
und dann sehe cat /tmp/a
ich die Farben. Durch Überprüfen mit od
bestätigt wird, dass die Datei ANSI-Farben verwendet.
Daher sollten Sie prüfen, ob Ihr Terminal ANSI-Farben unterstützt (und diese aktiviert sind).
less -R
zum Beispiel.