cat comando não mostra as linhas do texto [duplicado]

8

Eu estou tentando ler um arquivo odt do terminal. Quando eu digito cat myfile.odt, ele me mostra uma imagem como essa

    
por Angelos G 23.09.2016 / 10:17

3 respostas

21

O formato Libreoffice tem o texto dentro de uma seção compactada de um arquivo binário, então cat não funciona. Existe uma opção: lowriter --convert-to example.txt , que será reempacotado, & amp; existe uma opção --print se é isso que você queria. man lowriter é informativo.

    
por Mark Williams 23.09.2016 / 10:27
13

Por que não funciona como esperado?

cat funciona em arquivos de texto . Um arquivo odt é tecnicamente (e muito simplificado) um ziped contendo alguns arquivos xml .

Como tal, o cat 'não pode ser usado para essa finalidade. Funciona apenas em texto simples.

O que você pode fazer em vez disso

Você pode, claro, extraí-lo e analisar os respectivos arquivos xml, mas acho que isso é um exagero para seus objetivos.

Uma alternativa para o que você está tentando é:

odt2txt --stdout file.odt

isso fornecerá o mesmo que cat em um arquivo txt, mas levará mais tempo dependendo do tamanho do arquivo. você precisará ter unoconv instalado

sudo apt install unoconv
    
por Bruni 23.09.2016 / 10:22
5

O arquivo odt é um pacote zip que inclui formatação e outros recursos para o documento.

Eu quero ver o conteúdo de um arquivo odt que você teria que descompactar. As palavras reais contidas no documento estão no arquivo content.xml .

Documentos do Word da Micosoft (* .docx) são do mesmo tipo de pacote. O texto de um documento do Word está em um arquivo de um arquivo compactado chamado document.xml .

Eu escrevi um script para realizar pesquisa de texto em meus documentos. O script levaria dois argumentos para o arquivo (nome de arquivo e texto a ser encontrado), extrairia o arquivo para uma pasta temporária, grep o conteúdo do arquivo xml e exibiria o nome do arquivo correspondente ao texto pesquisado.

Script de amostra para pesquisar todos os arquivos odt em um diretório e seus subdiretórios:

#!/bin/bash

directory=""
string=""
tempdir="/tmp/searchdir"

echo "Searching directory [$directory] for [$string]"
echo "---------------------------------------------"

if [ $# -ne 2 ]; then
    echo "Parameter error... Usage: [Directory to Search] [String to search]"
    echo "Note: Use quotes if spaces are included in directory or search string."
    echo "Exiting..."
    exit 1
fi

mkdir $tempdir

while IFS= read -r -d '' i;
do
        # echo Processing: $i

        unzip -o "$i" -d $tempdir content.xml > /dev/null 2>&1

        found=$(egrep -i "$string" $tempdir/content.xml)
        if [[ "$found" ]];  then
            echo "Found in [$i]"
        fi

        [[ -f /tmp/content.xml ]] && rm /tmp/content.xml # remove the temporary file if exist
done < <(find  $directory -name \*odt -print0)
rm -r $tempdir
    
por L. D. James 23.09.2016 / 10:26

Tags