处理控制字符

处理控制字符

我有一个日志文件,其中包含一堆不可见的控制字符,例如十六进制 \u0003。

我想使用 SED 之类的东西替换它,但无法使正则表达式的第一部分匹配:

/s/^E/some_string

我通过按 CTRL-V CTRL-0 CTRL-3 创建特殊字符来创建 ^E,如从“man ascii”页面读取的那样:

003 3 03 ETX

但是,没有任何内容与该控制字符匹配。

任何帮助表示赞赏!

答案1

您也可以使用该tr命令。例如:

删除控制字符:

tr -d '\033' < file

要将控制字符替换为另一个控制字符:

tr '\033' 'x' < file

如果您不确定控制字符的值是什么,请执行八进制转储,它将打印出来:

$ cat file
hello
^[
world

$ od -b file    
0000000 150 145 154 154 157 012 033 012 167 157 162 154 144 012
0000016

所以控制字符的^[值为\033

答案2

这个 perl 单行代码将完成这项工作 - 请注意,它会修改文件:

perl -i -pe 's#\x{0003}#some_string#g' /path/to/log/file

如果要用指定范围内的字符代码替换多个字符:

echo {A..Z} | perl -i -pe 's#[\x{0040}-\x{0047}]#P#g'
P P P P P P P H I J K L M N O P Q R S T U V W X Y Z 

回声{A..Z}在 bash 中生成一串字母字符)

答案3

这将替换所有不可打印的字符为#

sed 's/[^[:print:]]/#/g' logfile

答案4

我不确定我是否理解你想要什么,但如果它是代替连续的十六进制字节 0x00 0x03 的出现,这应该有效:

$ echo '0 61 20 00 03 0A' | xxd -r | sed 's/\x00\x03/test/g' 
a test

相关内容