我有一个日志文件,其中包含一堆不可见的控制字符,例如十六进制 \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