gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:16:24 25 4
gpt4 key购买 nike

我有一个包含两个非 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 的问题所在。

最佳答案

sed 's/[^ -~]//g'

或者正如另一个答案所暗示的那样
sed 's/[\x80-\xff]//g'

section 3.9 sed 信息页面。标题为逃脱的章节。

编辑 对于 OSX, native 语言设置为 en_US.UTF-8

尝试
LANG='' sed 's/[^ -~]//g' myfile

这适用于这里的 osx 机器,我不完全确定为什么它在 UTF-8 中不起作用

关于regex - 用 sed 剥离十六进制字节 - 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3435370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com