首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >抓取二进制文件和UTF16

抓取二进制文件和UTF16
EN

Stack Overflow用户
提问于 2010-09-20 23:25:04
回答 6查看 56K关注 0票数 70

标准的grep/pcregrep等可以方便地与ASCII或UTF8数据的二进制文件一起使用-有没有一种简单的方法让他们也尝试UTF16 (最好是同时使用,但也可以)?

我试图获取的数据都是ASCII (库中的引用等),只是找不到,因为有时任何两个字符之间都有00,有时没有。

我看不到任何方法可以从语义上完成它,但这些00应该可以做到这一点,除非我不能轻易地在命令行中使用它们。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-09-24 02:01:12

最简单的方法是将文本文件转换为utf-8并通过管道将其转换为grep:

代码语言:javascript
复制
iconv -f utf-16 -t utf-8 file.txt | grep query

我试图做相反的事情(将我的查询转换为utf-16),但似乎grep不喜欢这样。我认为这可能与字符顺序有关,但我不确定。

似乎grep会将utf-16格式的查询转换为utf-8/ascii格式。这是我尝试过的:

代码语言:javascript
复制
grep `echo -n query | iconv -f utf-8 -t utf-16 | sed 's/..//'` test.txt

如果test.txt是utf-16文件,这将不起作用,但如果test.txt是ascii,它可以工作。我只能得出结论,grep正在将我的查询转换为ascii。

编辑:这是一个非常非常疯狂的方法,它可以工作,但不能给你太多有用的信息:

代码语言:javascript
复制
hexdump -e '/1 "%02x"' test.txt | grep -P `echo -n Test | iconv -f utf-8 -t utf-16 | sed 's/..//' | hexdump -e '/1 "%02x"'`

它怎麽工作?它将你的文件转换成十六进制(没有任何额外的格式,这是十六进制通常适用的)。它将其通过管道传输到grep。Grep使用的查询是通过将查询(不带换行符)回显到iconv中构造的,iconv将其转换为utf-16。然后将其通过管道传输到sed,以删除BOM (用于确定字节顺序的utf-16文件的前两个字节)。然后将其输送到十六进制转储中,以便查询和输入是相同的。

不幸的是,如果只有一个匹配项,我认为这将最终打印出整个文件。此外,如果二进制文件中的utf-16存储在与您的机器不同的字节顺序中,这将不起作用。

EDIT2:明白了!

代码语言:javascript
复制
grep -P `echo -n "Test" | iconv -f utf-8 -t utf-16 | sed 's/..//' | hexdump -e '/1 "x%02x"' | sed 's/x/\\\\x/g'` test.txt

这将在文件test.txt中搜索字符串Test ( utf-16)的十六进制版本

票数 77
EN

Stack Overflow用户

发布于 2015-11-10 10:28:26

您可以显式地将空值(00s)包括在搜索字符串中,尽管您将获得包含空值的结果,因此您可能希望将输出重定向到一个文件,以便可以使用合理的编辑器查看它,或者通过sed来替换空值。在*.utf16.txt中搜索"bar“:

代码语言:javascript
复制
grep -Pa "b\x00a\x00r" *.utf16.txt | sed 's/\x00//g'

"-P“告诉grep接受Perl regexp语法,该语法允许\x00扩展为null,而-a则告诉它忽略Unicode对它来说像是二进制这一事实。

票数 15
EN

Stack Overflow用户

发布于 2018-03-02 06:09:06

我发现下面的解决方案最适合我,来自https://www.splitbits.com/2015/11/11/tip-grep-and-unicode/

Grep不能很好地处理Unicode,但可以解决这个问题。例如,要查找,

代码语言:javascript
复制
Some Search Term

在UTF-16文件中,使用正则表达式忽略每个字符的第一个字节,

代码语言:javascript
复制
S.o.m.e. .S.e.a.r.c.h. .T.e.r.m 

另外,告诉grep将文件作为文本处理,使用'-a',最后的命令如下所示,

代码语言:javascript
复制
grep -a 'S.o.m.e. .S.e.a.r.c.h. .T.e.r.m' utf-16-file.txt
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3752913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档