grep
Es una herramienta de procesamiento de texto. Espera que su entrada sean archivos de texto . Parece que lo mismo ocurre tr
con macOS (aunque tr
se supone que admite archivos binarios).
Las computadoras almacenan datos como secuencias de bytes . Un texto es una secuencia de caracteres. Hay varias formas de codificar caracteres como bytes, llamadas codificaciones de caracteres . La codificación de caracteres estándar de facto en la mayoría del mundo, especialmente en OSX, es UTF-8 , que es una codificación para el conjunto de caracteres Unicode . Hay solo 256 bytes posibles, pero más de un millón de caracteres Unicode posibles, por lo que la mayoría de los caracteres están codificados como bytes múltiples. UTF-8 es una codificación de longitud variable: dependiendo del carácter, puede tomar de uno a cuatro bytes codificar un carácter. Algunas secuencias de bytes no representan ningún carácter en UTF-8. Por lo tanto, hay secuencias de bytes que no son archivos de texto UTF-8 válidos.
tr
se queja porque encontró una secuencia de bytes de este tipo. Espera ver un archivo de texto codificado en UTF-8, pero ve datos binarios que no son válidos UTF-8.
Un documento de Microsoft Word no es un archivo de texto: es un documento de procesamiento de texto. Los formatos de documentos de procesamiento de texto codifican no solo texto, sino también formato, imágenes incrustadas, etc. El formato de Word, como la mayoría de los formatos de procesamiento de texto, no es un archivo de texto.
Puede indicar a las herramientas de procesamiento de texto que operen en bytes cambiando la configuración regional . Específicamente, seleccione la configuración regional "C", que básicamente significa "nada lujoso". En la línea de comando, puede elegir la configuración regional con variables de entorno .
export LC_CTYPE=C
tr '\r' '\n' < target-file | grep search-string
Esto no emitirá ningún error, pero tampoco hará nada útil ya que target-file
todavía es un archivo binario que es poco probable que contenga la mayoría de las cadenas de búsqueda que especificará.
Por cierto, tr '\r' '\n'
no es un comando muy útil a menos que le queden archivos de texto de Mac OS 9 o anterior. \r
(retorno de carro) era el separador de nueva línea en Mac OS antes de Mac OS X. Desde OSX, el separador de nueva línea es \n
(avance de línea, el estándar de Unix) y los archivos de texto no contienen retornos de carro. Windows usa la secuencia de dos caracteres CR-LF para representar saltos de línea; tr -d '\r'
convertiría un archivo de texto de Windows en un archivo de texto Unix / Linux / OSX.
Entonces, ¿cómo puede buscar en un documento de Word desde la línea de comandos? Un .docx
documento de Word es en realidad un archivo zip que contiene varios archivos, los principales están en XML .
unzip -l Position-Paper-Final-Version.docx
Mac OS X incluye la utilidad zipgrep para buscar dentro de archivos zip.
zipgrep DeCSS Position-Paper-Final-Version.docx
El resultado no será muy legible porque los archivos XML en formato docx consisten principalmente en una gran línea. Si desea buscar dentro del texto del cuerpo principal del documento, extraiga el archivo word/document.xml
del archivo. Tenga en cuenta que, además del texto del documento, este archivo contiene marcado XML que representa la estructura del documento. Puede masajear un poco el marcado XML sed
para dividirlo en líneas manejables.
unzip -p Position-Paper-Final-Version.docx word/document.xml |
sed -e 's/></>\n</g' |
grep DeCSS