如何以自动方式搜索,替换特定的十六进制代码

时间:2013-07-26 22:03:28

标签: linux bash

我有一个100M行文件,它有一些编码问题 - “最初”是EBCDIC,保存为US-ASCII,现在是UTF-8。我不太了解它的遗产,对不起 - 我刚被要求分析内容。

EBCDIC中的“分”字符在随机位置“隐藏”在此文件中,导致各种错误。以下是关于此问题的更多内容:cents character in hex

使用iconv -f foo -t UTF-8 -c转换此文件不起作用 - 以美分字符为准。

当我使用十六进制编辑器时,我可以找到0xC2 0xA2(c2a2)的外观。但在BIG文件中,这并不理想。 Sed不能在十六进制级别工作,所以...不确定tr - 我只用它来回车/换行。

我可以用什么linux实用程序/命令在非常大的文件上快速找到并删除这个字符?

2部分:

 1 -- utility / command to find / count the number of these occurrences (octal \242)
 2 -- command to replace (this works  tr '\242' ' ' < source > output )

文本如何显示在我的ubuntu终端上:

1019EQ?IT DEPT GENERATED 

使用xxd,它如何看待十六进制级别(ascii到侧面看起来与上面相同):

0000000: 3130 3139 4551 a249 5420 4445 5054 2047 454e 4552 4154 4544 0d0a 

使用xxd,看看“show ebcdic”的样子 - 在这里,只是从侧面显示ebcdic:

......s.....&....+........

所以十六进制“a2”是罪魁祸首。我现在正在尝试xxd -E foo | grep a2来计算实例数。

为感兴趣的人添加od -ctxl而不是xxd的输出:

 0000000   1   0   1   9   E   Q 242   I   T       D   E   P   T       G
          31  30  31  39  45  51  a2  49  54  20  44  45  50  54  20  47
 0000020   E   N   E   R   A   T   E   D  \r  \n
          45  4e  45  52  41  54  45  44  0d  0a

1 个答案:

答案 0 :(得分:1)

当你说文件被转换时,你的意思是什么?你是说二进制文件只是从IBM 360转储到另一台基于ASCII的计算机,还是文件本身在转移时转换为ASCII?

问题是文件是否实际上处于编码良好的状态。另一个问题是你希望如何编码文件?

在我的Mac上(默认使用UTF-8,就像Linux系统一样),使用sed摆脱¢字符没有问题:

这是我的档案:

$ cat test.txt
This is a test --¢-- TEST TEST
$ od -ctx1 test.txt
0000000    T   h   i   s       i   s       a       t   e   s   t       -
           54  68  69  73  20  69  73  20  61  20  74  65  73  74  20  2d
0000020    -   ¢  **   -   -       T   E   S   T       T   E   S   T  \n
           2d  c2  a2  2d  2d  20  54  45  53  54  20  54  45  53  54  0a
0000040

您可以看到cat打印出¢字符没有问题。并且,您可以在od转储中看到c2a2字符的¢编码。

$ sed 's/¢/$/g' test.txt > new_test.txt
$ cat new_test.txt
This is a test --$-- TEST TEST
$ od -ctx1  new_test.txt
0000000    T   h   i   s       i   s       a       t   e   s   t       -
           54  68  69  73  20  69  73  20  61  20  74  65  73  74  20  2d
0000020    -   $   -   -       T   E   S   T       T   E   S   T  \n    
           2d  24  2d  2d  20  54  45  53  54  20  54  45  53  54  0a    
0000037

这是我的sed将¢更改为$符号没有问题。转储现在显示此测试文件等同于严格的ASCII编码文件。编码¢的两个十六进制数字现在是一个很好的干净单个十六进制数字编码$

看起来sed可以解决您的问题。

如果要在Windows系统上使用此文件,可以将文件转换为标准Windows代码页面1252:

$ iconv -f utf8 -t cp1252 test.txt > new_test.txt 
$ cat new_test.txt 
This is a test --?-- TEST TEST
$ od -ctx1  new_test.txt
0000000    T   h   i   s       i   s       a       t   e   s   t       -
           54  68  69  73  20  69  73  20  61  20  74  65  73  74  20  2d
0000020    - 242   -   -       T   E   S   T       T   E   S   T  \n    
           2d  a2  2d  2d  20  54  45  53  54  20  54  45  53  54  0a    
0000037

以下是Codepage 1252中的文件,就像Windows喜欢它一样!请注意,¢现在是一个很好的十六进制242字符。

那么,究竟是什么问题呢?您需要以纯ASCII定义 127个字符进行归档吗?您是否需要编码的文件,因此Windows机器可以使用它?你输入¢字符有问题吗?

让我知道。我不是来自政府,但我来这里是为了帮助你。