Bash-Befehl zum Ersetzen aller nicht druckbaren Zeichen?

1373
David162795

Ich habe ein Bash-Skript, das die Datenbank auf Änderungen überprüft und mir diese Änderungen per E-Mail sendet. Funktioniert gut, bis es versucht, etwas nicht druckbares zu senden, was die Mail "bricht".

Gibt es eine praktische Möglichkeit, alle nicht druckbaren Zeichen aus einem String durch ihren Hexadezimalcode zu ersetzen (z. B. " abc <1A> def <07> xyz ")?

Alles, woran ich denken kann, ist eine lange Kette von sedBefehlen, die jeweils einzelne Zeichen übergeben. Das scheint nicht richtig zu sein.

edit: Nachdem ich diese Frage gestellt hatte, fand ich den cat -vBefehl, der hauptsächlich das tat, was ich wollte. Verwenden Sie dies vorerst, es sei denn, jemand zeigt etwas Besseres.

1

2 Antworten auf die Frage

3
tripleee

Sie können eine einfache Ersetzung wie verwenden

perl -pe 's/([^[:print:]\n])/sprintf("<%02X>", ord($1))/ge' 

Der lessBefehl hat ein Ausgabeformat, das dem von Ihnen angegebenen sehr ähnlich ist, es werden jedoch die Steuerzeichen in Ihrer Beispielzeichenfolge für mich gedruckt. Vielleicht haben Sie mehr Glück damit (ich denke, mein System ist zu modern :-). Es sollte kein Paging durchgeführt werden, wenn die Ausgabe nicht an ein Terminal erfolgt, und es sollte - hoffentlich mit den gewünschten Ersetzungen - durchlaufen werden, wenn Sie es von Ihrer Crontab aus ausführen.

0
Overmind

Verwenden Sie bei ASCII-Gruppen ein inkrementelles 'for'.

Dies sind die Hex-Werte, die Sie berücksichtigen sollten (ASCII): 20-2F 3A-40 5B-60 7B-FF

Im Grunde decken Sie mit nur 4 fors alle Zeichen außer Zahlen und Buchstaben ab. Das Ausschließen weiterer komplizierter Dinge (z. B. wenn Sie nicht "-" oder "_" entfernen).

Ich verstehe diese Antwort nicht. Meinen Sie eine "for" -Schleife in der Schale? tripleee vor 6 Jahren 0
Sie können jede Art von bedingter Schleife verwenden, die Sie bevorzugen. Overmind vor 6 Jahren 0
Aber so ist das, was du sagst, Schleife über Reihen von Zeichen der Reihe nach? Verglichen mit einem einzigen Regex ist das furchtbar ineffizient. tripleee vor 6 Jahren 0
Wie gesagt, es liegt an der Präferenz. Da ich alle benötigten ASCII-Bereiche bereits definiert habe, kann ich tatsächlich eine einzige Variable in einer beliebigen Syntax verwenden. Overmind vor 6 Jahren 0
Ich verstehe, wie man ein Programm dafür schreibt, aber ohne dieses Programm wird die Frage nicht wirklich beantwortet. tripleee vor 6 Jahren 0