Linux 如何自动搜索、替换特定十六进制代码
我有一个100M行的文件,它有一些编码问题——最初是EBCDIC,保存为US-ASCII,现在是UTF-8。我对它的传统知之甚少,抱歉——我刚被要求分析它的内容 EBCDIC中的“美分”字符在该文件中的任意位置被“隐藏”,从而导致各种错误。下面是关于这个混蛋的更多信息: 使用iconv-f foo-t UTF-8-c转换此文件不起作用——以美分字符为准 当我使用十六进制编辑器时,我可以找到0xC2 0xA2(c2a2)的外观。但在一个大文件中,这并不理想。Sed在十六进制级别不起作用,所以。。。不确定tr——我只在回车/换乘新线路时使用它 我可以使用什么linux实用程序/命令在非常大的文件上合理地快速查找和删除此字符 2部分:Linux 如何自动搜索、替换特定十六进制代码,linux,bash,Linux,Bash,我有一个100M行的文件,它有一些编码问题——最初是EBCDIC,保存为US-ASCII,现在是UTF-8。我对它的传统知之甚少,抱歉——我刚被要求分析它的内容 EBCDIC中的“美分”字符在该文件中的任意位置被“隐藏”,从而导致各种错误。下面是关于这个混蛋的更多信息: 使用iconv-f foo-t UTF-8-c转换此文件不起作用——以美分字符为准 当我使用十六进制编辑器时,我可以找到0xC2 0xA2(c2a2)的外观。但在一个大文件中,这并不理想。Sed在十六进制级别不起作用,所以。。。
1 -- utility / command to find / count the number of these occurrences (octal \242)
2 -- command to replace (this works tr '\242' ' ' < source > output )
对于xxd,它在十六进制级别的外观(侧面的ascii与上面的外观相同):
对于xxd,“显示ebcdic”的外观——这里,仅从侧面显示ebcdic:
......s.....&....+........
所以十六进制“a2”是罪魁祸首。我现在正在尝试xxd-efoo | grepa2来统计实例
为感兴趣的人添加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
你说文件被转换了是什么意思?您的意思是二进制文件只是从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
这里的文件现在在代码页1252就像Windows喜欢它的方式!请注意,、
现在是一个很好的十六进制242字符
$ 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
那么,到底是什么问题?是否需要使用纯ASCII定义的127个字符进行归档?您是否需要对文件进行编码,以便Windows计算机可以处理它?您在输入字符时有问题吗
让我知道。我不是政府官员,但我是来帮助你的。当你说文件被转换时,你是什么意思?您的意思是二进制文件只是从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
这里的文件现在在代码页1252就像Windows喜欢它的方式!请注意,、
现在是一个很好的十六进制242字符
$ 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
那么,到底是什么问题?是否需要使用纯ASCII定义的127个字符进行归档?您是否需要对文件进行编码,以便Windows计算机可以处理它?您在输入字符时有问题吗
让我知道。我不是来自政府,但我来这里是为了帮助你。注意,我也尝试过使用iconv从EBCDIC编码到UTF-8,但没有杀死这个十六进制代码!!为什么不
sed的///g'
sed
不需要支持它,shell需要支持。如果shell没有,那么为什么不sed's/\xc2\xa2//g'
?摆脱,完全是老派的——我的第一次商业编程工作涉及用COBOL编写一个EBCDIC到ASCII转换程序,该程序可以通过JCL调用,并且避免了我们为类似的实用程序向IBM支付250000美元/年的费用。那是在1990年。2013年再次发现EBCDIC令人震惊!我是一名廉价的实习生,他们只花很少的钱就编写了这个程序——对我的雇主来说,投资回报率非常高。rid——这个命令不起作用:sed的/\xc2\xa2//g'source>new。美分符号保留在文件中注意,我也尝试过使用iconv从EBCDIC编码到UTF-8——但没有杀死这个十六进制代码!!为什么不sed的///g'
sed
不需要支持它,shell需要支持。如果shell没有,那么为什么不sed's/\xc2\xa2//g'
?摆脱,完全是老派的——我的第一次商业编程工作涉及用COBOL编写一个EBCDIC到ASCII转换程序,该程序可以通过JCL调用,并且避免了我们为类似的实用程序向IBM支付250000美元/年的费用。那是在1990年。2013年再次发现EBCDIC令人震惊!我是一名廉价的实习生,他们只花很少的钱来写sa