我有一个包含两个非ASCII字节(0xFF和0xFE)的文本文件:
??58832520.3,ABC
348384,DEF
该文件的十六进制表示为:
FF FE 35 38 38 33 32 35 32 30 2E 33 2C 41 42 43 0A 33 34 38 33 38 34 2C 44 45 46
巧合的是,FF和FE恰好是主要的字节(它们存在于我的文件中,尽管似乎总是在一行的开头)。
我试图使用sed删除这些字节,但是我所做的一切似乎都无法匹配它们。
$ sed 's/[^a-zA-Z0-9\,]//g' test.csv
??588325203,ABC
348384,DEF
$ sed 's/[a-zA-Z0-9\,]//g' test.csv
??.
主要问题:我该如何去除这些字节?
奖励问题:上面的两个正则表达式是直接取反的,因此其中一个逻辑上必须过滤掉这些字节,对吗?为什么这两个正则表达式都匹配0xFF和0xFE字节?
更新:直接删除一系列十六进制字节的方法(下面两个答案中建议的方法)似乎会删除每行的第一个“合法”字节,并保留我想要摆脱的字节:
$sed 's/[\x80-\xff]//' test.csv
??8832520.3,ABC
48384,DEF
FF FE 38 38 33 32 35 32 30 2E 33 2C 41 42 43 0A 34 38 33 38 34 2C 44 45 46 0A
注意每行开头缺少的"5"和"3",以及文件末尾新增的0A。
更新:这个问题似乎是系统特定的。该问题在OSX系统上被观察到,但建议(包括我上面的原始sed语句)在NetBSD上按照预期工作。
解决方案:同样的任务通过Perl似乎很容易:
$ perl -pe 's/^\xFF\xFE//' test.csv
58832520.3,ABC
348384,DEF
然而,我将保留这个问题的开放状态,因为这只是一个解决方法,而不能解释sed存在的问题。