用于替换所有不可打印字符的 Bash 命令?

用于替换所有不可打印字符的 Bash 命令?

我有一个 bash 脚本,用于检查数据库中的更改并通过电子邮件将这些更改发送给我。运行良好,直到它尝试发送一些不可打印的内容,从而“破坏”邮件。

是否有任何方便的方法可以用十六进制代码替换字符串中所有不可打印的字符(就像是 ”abc<1A>def<07>xyz“)?

我所能想到的只是一长串的sed命令,每个命令处理一个字符。这似乎不对。

编辑:发布此问题后,我发现cat -v命令基本满足了我的要求。目前使用此命令,除非有人指出更好的方法。

答案1

你可以使用简单的替换,例如

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

less命令的输出格式与您指定的格式非常相似,但它会逐字逐句地为我打印示例字符串中的控制字符。也许您运气更好(我想我的系统太现代了 :-)。当输出不是到终端时,它不应该执行分页,因此当您从 crontab 运行它时,它应该只是通过 — 希望带有所需的替换。

答案2

对 ASCII 组使用增量“for”。

这些是您应该覆盖的十六进制值(ASCII):20-2F 3A-40 5B-60 7B-FF

因此,基本上只需 4 个 for,您便可以覆盖除数字和字母之外的所有字符。排除更多字符会使事情变得复杂(例如,如果您不想删除“-”或“_”)。

相关内容