删除Linux文件中的十六进制代码

时间:2018-07-16 18:29:53

标签: shell vim awk sed encoding

我们今天收到的文件中包含很多<96>:

A^Y^ABC^EFG^HIJK<96>this - PM^0^0^0^456^-123^0^0^0^0^0^0^0^08/10/18

我们想将其更正为:

A^Y^ABC^EFG^HIJK^this - PM^0^0^0^456^-123^0^0^0^0^0^0^0^08/10/18

我在vi中进行了此操作,但显示未找到模式:

:%s/<96>/^/g

我尝试过

od -c file.txt

并返回:

0000000   A   ^   Y   ^   A   B  C   ^   E   F    G
0000020   ^   H   I   J   K   <   9   6   >   t   h   i    
0000040   s       -       P
0000060   M   ^   0   ^   0   ^   0   ^   4   6   6   ^   -   1   2   3
0000100   ^   0   ^   0   ^   0   ^   0   ^   0   ^   0   ^   0   ^   0
0000120   8   /   1   0   /   1   8  \n

提示<96>是<96>。不知道为什么我不能在vi中替换<96>。我也很好奇<96>在这里是什么意思?有上师可以帮忙吗?谢谢!

2 个答案:

答案 0 :(得分:4)

您可以在Vim中将十六进制字符96替换为:

:%s/\%x96/^/g

这里是:help regex

                            /\%d /\%x /\%o /\%u /\%U E678

\%d123  Matches the character specified with a decimal number.  Must be
        followed by a non-digit.
\%o40   Matches the character specified with an octal number up to 0377.
        Numbers below 040 must be followed by a non-octal digit or a non-digit.
\%x2a   Matches the character specified with up to two hexadecimal characters.
\%u20AC Matches the character specified with up to four hexadecimal
        characters.
\%U1234abcd     Matches the character specified with up to eight hexadecimal
        characters.

在脚本中,您可以将其替换为八进制的tr

LC_ALL=C tr '\226' '^'  <myfile.txt  >newfile.txt

答案 1 :(得分:1)

(主要来自How to search and replace an unprintable character,请阅读以获取更多建议)

如果要查找和替换无法打印的字符,请将光标移到该字符上,然后按
ga
这将在屏幕底部显示字符的十六进制值。

查找并替换该十六进制字符,运行
:%s/\%x[Hex]/[Replacement]/g
其中[Hex]是您找到的2位十六进制代码,而[replacement]是您想要的任何内容。

如果十六进制代码是4位数字,请运行此代码 :%s/\%u[Hex]/[Replacement]/g