一位同事创建了一个构建树(通过gradle :dependencies > dependencies.txt
)并将其通过电子邮件发送给我。我摸索了一个我想知道版本的库,所以我执行了:
grep log4j dependencies.txt
但是匹配为零,我的shell刚打印了一个新提示。由于文件很长而且我信任grep,所以没有打开它并进行检查。然后,经过反复的讨论,我被告知该文件是在Windows计算机上创建的。即使这样,我还是对grep无法正常工作感到惊讶-搜索字符串没有被换行符打断。但是执行后:
dos2unix dependencies.txt
Grep开始显示我想要的比赛。
显然,我对grep的工作方式的理解是错误的。当搜索词出现而中间没有换行符时,为什么grep在不同操作系统上对文件内容的行为方式不一样?
file dependencies.txt
退货 dependencies.txt: Little-endian UTF-16 Unicode text, with CRLF, CR line terminators
LC_ALL=C grep log4j dependencies.txt
什么都不返回grep o dependencies.txt
回来 Binary file depdencies.txt matches
grep --text dependencies.txt
什么也没返回UTF-16文本由16位组成,因此每个字母至少存储在两个字节中。如果只是ASCII字符,则其他所有字节均为零字节(NUL字节\0
,而不是字符零)。您的Mac很可能无法对其进行设置。
特别是,NUL字节在C中被当作字符串终止符,因此许多工具可能根本无法处理它们。即使他们可以与他们打交道,他们也可能会将每个NUL当作一个不同的字符,因此您需要类似l.o.g.4.j
该字符串的内容。
但是有趣的是,在打印时看不到NUL字节,因此,如果要将cat
文件例如发送到终端,则看起来可能很正常。
NUL也是grep认为文件二进制的原因。
另请参阅:是什么使grep认为文件是二进制文件?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句