grep
是文本处理工具。它期望它们的输入是文本文件。似乎tr
在macOS上也是如此(即使tr
应该支持二进制文件)。
计算机将数据存储为字节序列。文本是字符序列。有几种将字符编码为字节的方法,称为字符编码。世界上大多数国家(尤其是在OSX上)事实上的标准字符编码是UTF-8,这是Unicode字符集的编码。只有256个可能的字节,但可能超过一百万个Unicode字符,因此大多数字符都编码为多个字节。UTF-8是一种可变长度编码:根据字符的不同,编码一个字符可能需要一到四个字节。某些字节序列不表示UTF-8中的任何字符。因此,有些字节序列不是有效的UTF-8文本文件。
tr
正在抱怨,因为它遇到了这样的字节序列。它希望看到一个以UTF-8编码的文本文件,但它看到的是无效的UTF-8二进制数据。
Microsoft Word文档不是文本文件:它是文字处理文档。文字处理文档格式不仅编码文本,而且还编码格式,嵌入的图像等。与大多数文字处理格式一样,Word格式也不是文本文件。
您可以通过更改语言环境来指示文本处理工具对字节进行操作。具体来说,选择“ C”语言环境,这基本上意味着“没什么”。在命令行上,可以选择带有环境变量的语言环境设置。
export LC_CTYPE=C
tr '\r' '\n' < target-file | grep search-string
这不会发出任何错误,但也不会做任何有用的事情,因为target-file
它仍然是一个二进制文件,不太可能包含您指定的大多数搜索字符串。
顺便说一句,tr '\r' '\n'
这不是一个非常有用的命令,除非您有Mac OS 9或更早版本遗留下的文本文件。\r
(回车符)是Mac OS X之前的Mac OS中的换行符。自OSX起,换行符为\n
(换行符,unix标准),并且文本文件不包含回车符。Windows使用两个字符的序列CR-LF表示换行符。tr -d '\r'
将Windows文本文件转换为Unix / Linux / OSX文本文件。
那么如何从命令行中搜索Word文档呢?一个.docx
Word文件实际上是一个ZIP压缩文件包含多个文件,其中主要是在XML。
unzip -l Position-Paper-Final-Version.docx
Mac OS X包含zipgrep实用程序,用于搜索内部zip文件。
zipgrep DeCSS Position-Paper-Final-Version.docx
由于docx格式的XML文件主要由一行大行组成,因此结果将不太可读。如果要在文档的主体文本中进行搜索,请word/document.xml
从存档中提取文件。请注意,除了文档文本外,此文件还包含表示文档结构的XML标记。您可以对XML标记进行一些调整,sed
以将其分成可管理的行。
unzip -p Position-Paper-Final-Version.docx word/document.xml |
sed -e 's/></>\n</g' |
grep DeCSS