Команда Bash для замены всех непечатаемых символов?

У меня есть скрипт bash, который проверяет базу данных на наличие изменений и отправляет мне эти изменения по электронной почте. Работает хорошо, пока не попытается отправить что-то непечатное, что "сломает" почту.

Есть ли какой-нибудь удобный способ, как заменить все непечатаемые символы из строки их шестнадцатеричным кодом (что-то вроде "abc<1A>def<07>xyz")?

Все, о чем я могу думать, - это цепочка sed Команды, передающие по одному символу каждая. Который не кажется правильным.

редактировать: после публикации этого вопроса, я нашел cat -v Команда делает в основном то, что я хотел. Используя это сейчас, если кто-то не указывает на что-то лучшее.

2 ответа

Решение

Вы можете использовать простую замену, как

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

less Команда имеет формат вывода, очень похожий на тот, который вы указали, но она печатает управляющие символы в строке примера для меня буквально. Возможно, вам повезет больше (я думаю, что моя система слишком современная:-). Он не должен выполнять пейджинг, когда вывод не на терминал, поэтому он должен просто проходить - надеюсь, с желаемыми заменами - когда вы запускаете его из своего crontab.

Используйте инкремент "для" с группами ASCII.

Это шестнадцатеричные значения, которые вы должны охватывать (ASCII): 20-2F 3A-40 5B-60 7B-FF

Таким образом, в основном всего 4 форса, вы покрываете все символы, кроме цифр и букв. Исключение более усложняющих вещей (например, если вы не хотите удалять "-" или "_", например).

Другие вопросы по тегам