Команда 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 форса, вы покрываете все символы, кроме цифр и букв. Исключение более усложняющих вещей (например, если вы не хотите удалять "-" или "_", например).