用 sed 去除文件中的 ASCII 控制字符乱码

工作中遇到文件中含有 ASCII 控制字符的情况,其转成的 json 无法入 elasticsearch。开始使用 java 来做替换处理,后来发现使用 sed 效率高出很多。现将该段 sed 命令记录下来,其中 ASCII 码参考:
https://baike.baidu.com/item/ASCII/309296?fr=aladdin&fromid=19660475&fromtitle=ascii%E7%A0%81%E8%A1%A8

写成多行便于观察(实际使用时是写成一行)

sed -r 
 -e 's/\x00/[NUL]/g'
 -e 's/\x01/[SOH]/g'
 -e 's/\x02/[STX]/g'
 -e 's/\x03/[ETX]/g'
 -e 's/\x04/[EOT]/g'
 -e 's/\x05/[ENQ]/g'
 -e 's/\x06/[ACK]/g'
 -e 's/\x07/[BEL]/g'
 -e 's/\x08/[BS]/g'
 -e 's/\x0A/[LF]/g'
 -e 's/\x0B/[VT]/g'
 -e 's/\x0C/[FF]/g'
 -e 's/\x0D/[CR]/g'
 -e 's/\x0E/[SO]/g'
 -e 's/\x0F/[SI]/g'
 -e 's/\x10/[DLE]/g'
 -e 's/\x11/[DC1]/g'
 -e 's/\x12/[DC2]/g'
 -e 's/\x13/[DC3]/g'
 -e 's/\x14/[DC4]/g'
 -e 's/\x15/[NAK]/g'
 -e 's/\x16/[SYN]/g'
 -e 's/\x17/[ETB]/g'
 -e 's/\x18/[CAN]/g'
 -e 's/\x19/[EM]/g'
 -e 's/\x1A/[SUB]/g'
 -e 's/\x1B/[ESC]/g'
 -e 's/\x1C/[FS]/g'
 -e 's/\x1D/[GS]/g'
 -e 's/\x1E/[RS]/g'
 -e 's/\x1F/[US]/g'
 -e 's/\x7F/[DEL]/g'
 file_in > file_out

写成一行

sed -r -e 's/\x00/[NUL]/g' -e 's/\x01/[SOH]/g' -e 's/\x02/[STX]/g' -e 's/\x03/[ETX]/g' -e 's/\x04/[EOT]/g' -e 's/\x05/[ENQ]/g' -e 's/\x06/[ACK]/g' -e 's/\x07/[BEL]/g' -e 's/\x08/[BS]/g' -e 's/\x0A/[LF]/g' -e 's/\x0B/[VT]/g' -e 's/\x0C/[FF]/g' -e 's/\x0D/[CR]/g' -e 's/\x0E/[SO]/g' -e 's/\x0F/[SI]/g' -e 's/\x10/[DLE]/g' -e 's/\x11/[DC1]/g' -e 's/\x12/[DC2]/g' -e 's/\x13/[DC3]/g' -e 's/\x14/[DC4]/g' -e 's/\x15/[NAK]/g' -e 's/\x16/[SYN]/g' -e 's/\x17/[ETB]/g' -e 's/\x18/[CAN]/g' -e 's/\x19/[EM]/g' -e 's/\x1A/[SUB]/g' -e 's/\x1B/[ESC]/g' -e 's/\x1C/[FS]/g' -e 's/\x1D/[GS]/g' -e 's/\x1E/[RS]/g' -e 's/\x1F/[US]/g' -e 's/\x7F/[DEL]/g' file_in > file_out

其中的 \x00-\x1F 以及 \x7F 是 ASCII 码的控制字符,本替换要做的事是将这些字符替换成 “[NUL]” 这类的可见字符,以达到去除 ASCII 乱码的目的。本段代码中没有处理 \x09,因为 \x09 是 HT(横向制表符),即 \t 。对 \x09 的替换可以单独处理:

如果想把 \t 替换成空格,则在上段代码中加入

-e 's/\x09/ /g'

如果想把 \t 删掉,则在上段代码中加入

-e 's/\x09//g'

如果想把 \t 替换成 [HT],则在上段代码中加入

-e 's/\x09/[HT]/g'

你可能感兴趣的:(清洗数据)