1

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

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

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

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

2 ответа2

3

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

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

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

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .