使用sed剥离十六进制字节 - 不匹配

G__*_*G__ 7 regex macos hex sed

我有一个带有两个非ascii字节(0xFF和0xFE)的文本文件:

??58832520.3,ABC
348384,DEF
Run Code Online (Sandbox Code Playgroud)

此文件的十六进制是:

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
Run Code Online (Sandbox Code Playgroud)

巧合的是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 
??.
Run Code Online (Sandbox Code Playgroud)

主要问题:如何删除这些字节?
额外问题:上面的两个正则表达式是直接否定,因此其中一个逻辑上必须过滤掉这些字节,对吧?为什么这两个正则表达式都匹配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
Run Code Online (Sandbox Code Playgroud)

注意每行开头缺少"5"和"3",新的0A添加到文件末尾.

更大的更新:此问题似乎是系统特定的.在OSX上观察到了这个问题,但是建议(包括我上面的原始sed语句)正如我在NetBSD上所期望的那样工作.

解决方案:通过Perl,同样的任务看起来很容易:

$ perl -pe 's/^\xFF\xFE//' test.csv
58832520.3,ABC
348384,DEF
Run Code Online (Sandbox Code Playgroud)

但是,我将这个问题保持开放,因为这只是一个解决方法,并没有解释sed的问题.

dei*_*nst 6

sed 's/[^ -~]//g'
Run Code Online (Sandbox Code Playgroud)

或者正如另一个答案所暗示的那样

sed 's/[\x80-\xff]//g'
Run Code Online (Sandbox Code Playgroud)

请参阅sed 信息页面的第 3.9 节。这一章的标题是“逃脱”。

对于 OSX进行编辑,本机语言设置为 en_US.UTF-8

尝试

LANG='' sed 's/[^ -~]//g' myfile
Run Code Online (Sandbox Code Playgroud)

这可以在 osx 机器上运行,我不完全确定为什么它在 UTF-8 中不起作用