1
29
在Windows上,文件扩展名通常足够好:
但当然,文件扩展名并不完美。没有人喜欢键入长列表,而且很多文件的名称都是错误的。 我认为UNIX在文件系统中没有任何特殊的二进制和文本指示器。(嗯,vms确实有,但我怀疑这是你grep习惯的来源。)我看了grep-i的实现,很明显这只是一个基于文件第一块的快速n-dirty启发式方法。结果发现这是我的策略 a bit of experience 和。因此,我建议您选择适合Windows文本文件的启发式函数:
例如,这里是快速ASCII检测器:
我的目标使用模式是在“dir”和“ss”之间的管道中插入一个where-object子句。根据您的脚本风格,还有其他方法。 改进沿建议路径之一的检测算法留给读者。 编辑:我开始在自己的评论中回复你的评论,但是时间太长了… 上面,我从POV的白名单中查看了已知良好序列的问题。在我维护的应用程序中,将二进制文件错误地存储为文本的结果要比文本的结果差得多。同样的情况也适用于选择使用哪种ftp传输模式,或选择发送到电子邮件服务器的mime编码等情况。 在其他情况下,黑名单显然是伪造的,允许所有其他的东西被称为文本也是一种同样有效的技术。虽然U+0000是一个有效的代码点,但在现实世界中几乎找不到它。同时,在结构化二进制文件中(即,每当固定字节长度的字段需要填充时),00是非常常见的,因此它是一个非常简单的黑名单。vss 6.0单独使用了这个检查,并没有问题。 除此之外,*.zip文件是检查\0风险更大的一种情况。与大多数二进制文件不同,它们的结构化“header”(footer?)块在末尾,而不是开头。假设理想的熵压缩,前1kb中的no \0概率为(1-1/256)^1024或约2%。幸运的是,只需扫描4KB集群的其余NTFS读取就可以将风险降低到0.00001%,而无需更改算法或编写其他特殊情况。 若要排除无效的UTF-8,请将\c0-c1和\f8-fd和\fe-ff(在您看到可能的BOM之后)添加到黑名单。非常不完整,因为您实际上并没有验证序列,而是足够接近您的目的。如果你想比这更有趣,现在是时候调用一个平台库了,比如imultilang2::detectinputcodepage。 不知道为什么\c8(200十进制)在grep的列表中。它不是超长编码。例如,序列\c8\80表示_(U+0200)。可能是Unix特有的。 |
2
8
好吧,经过几个小时的研究,我相信我已经找到了解决办法。不过,我不会把这当作答案。 Pro Windows Powershell 有一个非常相似的例子。我完全忘记了我有这么好的推荐信。如果您对PowerShell感兴趣,请购买它。它详细介绍了get-content和unicode-bom。 这个 Answer 对于类似的问题,Unicode标识也非常有用。 这是剧本。如果你知道它可能有什么问题,请告诉我。
将此脚本另存为 ISPSARIA.PS1 这个脚本获取了我尝试更正的所有文本或二进制文件。 |
batman · 如何用特定模式grep特定行及其子网行? 2 年前 |
nickcrv06 · 在两个常量字符串之间提取单词 2 年前 |
Shin · 格雷普。来自文本文件的js URL 2 年前 |
Term Grecos · 在空格处从数组输出时,Bash字符串被切断 2 年前 |
jojo · 用正则表达式搜索,但仅用sed替换字符串的一部分 2 年前 |
David Gall · 查找在特定日期从特定计算机登录的所有用户 2 年前 |
mles · 如何从unzip-l的输出中grep特定路径 6 年前 |
LDAsh · 使用正则表达式返回通配符(重复行) 6 年前 |