Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何自动搜索、替换特定十六进制代码_Linux_Bash - Fatal编程技术网

Linux 如何自动搜索、替换特定十六进制代码

Linux 如何自动搜索、替换特定十六进制代码,linux,bash,Linux,Bash,我有一个100M行的文件,它有一些编码问题——最初是EBCDIC,保存为US-ASCII,现在是UTF-8。我对它的传统知之甚少,抱歉——我刚被要求分析它的内容 EBCDIC中的“美分”字符在该文件中的任意位置被“隐藏”,从而导致各种错误。下面是关于这个混蛋的更多信息: 使用iconv-f foo-t UTF-8-c转换此文件不起作用——以美分字符为准 当我使用十六进制编辑器时,我可以找到0xC2 0xA2(c2a2)的外观。但在一个大文件中,这并不理想。Sed在十六进制级别不起作用,所以。。。

我有一个100M行的文件,它有一些编码问题——最初是EBCDIC,保存为US-ASCII,现在是UTF-8。我对它的传统知之甚少,抱歉——我刚被要求分析它的内容

EBCDIC中的“美分”字符在该文件中的任意位置被“隐藏”,从而导致各种错误。下面是关于这个混蛋的更多信息:

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

当我使用十六进制编辑器时,我可以找到0xC2 0xA2(c2a2)的外观。但在一个大文件中,这并不理想。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 )
对于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