grep
é uma ferramenta de processamento de texto. Ele espera que sua entrada seja um arquivo de texto . Parece que o mesmo vale para o tr
macOS (embora tr
deva suportar arquivos binários).
Os computadores armazenam dados como sequências de bytes . Um texto é uma sequência de caracteres. Existem várias maneiras de codificar caracteres como bytes, chamados codificações de caracteres . A codificação de caracteres padrão de fato na maior parte do mundo, especialmente no OSX, é UTF-8 , que é uma codificação para o conjunto de caracteres Unicode . Existem apenas 256 bytes possíveis, mas mais de um milhão de caracteres Unicode possíveis; portanto, a maioria dos caracteres é codificada como vários bytes. UTF-8 é uma codificação de tamanho variável: dependendo do caractere, pode levar de um a quatro bytes para codificar um caractere. Algumas seqüências de bytes não representam nenhum caractere em UTF-8. Portanto, existem seqüências de bytes que não são arquivos de texto UTF-8 válidos.
tr
está reclamando porque encontrou uma sequência de bytes. Ele espera ver um arquivo de texto codificado em UTF-8, mas vê dados binários que não são válidos em UTF-8.
Um documento do Microsoft Word não é um arquivo de texto: é um documento de processamento de texto. Os formatos de documento de processamento de texto codificam não apenas texto, mas também formatação, imagens incorporadas etc. O formato do Word, como a maioria dos formatos de processamento de texto, não é um arquivo de texto.
Você pode instruir as ferramentas de processamento de texto a operar em bytes alterando o código do idioma . Especificamente, selecione a localidade “C”, que basicamente significa significa “nada sofisticado”. Na linha de comando, você pode escolher configurações de localidade com variáveis de ambiente .
export LC_CTYPE=C
tr '\r' '\n' < target-file | grep search-string
Isso não emitirá nenhum erro, mas também não será útil, pois target-file
ainda é um arquivo binário que dificilmente conterá a maioria das sequências de pesquisa que você especificará.
Aliás, tr '\r' '\n'
não é um comando muito útil, a menos que você tenha arquivos de texto restantes do Mac OS 9 ou anterior. \r
(retorno de carro) era o separador de nova linha no Mac OS antes do Mac OS X. Desde o OSX, o separador de nova linha é \n
(avanço de linha, o padrão unix) e os arquivos de texto não contêm retornos de carro. O Windows usa a seqüência de dois caracteres CR-LF para representar quebras de linha; tr -d '\r'
converteria um arquivo de texto do Windows em um arquivo de texto Unix / Linux / OSX.
Então, como você pode pesquisar em um documento do Word na linha de comando? Um .docx
documento do Word é na verdade um arquivo zip contendo vários arquivos, sendo os principais em XML .
unzip -l Position-Paper-Final-Version.docx
O Mac OS X inclui o utilitário zipgrep para pesquisar dentro de arquivos zip.
zipgrep DeCSS Position-Paper-Final-Version.docx
O resultado não será muito legível, porque os arquivos XML no formato docx consistem principalmente em uma linha enorme. Se você deseja pesquisar dentro do texto do corpo principal do documento, extraia o arquivo word/document.xml
do arquivo morto. Observe que, além do texto do documento, este arquivo contém marcação XML que representa a estrutura do documento. Você pode massagear um pouco a marcação XML sed
para dividi-la em linhas gerenciáveis.
unzip -p Position-Paper-Final-Version.docx word/document.xml |
sed -e 's/></>\n</g' |
grep DeCSS