comando cat non mostra le linee del testo [duplicato]

8

Sto cercando di leggere un file odt dal terminale. Quando scrivo cat myfile.odt mi mostra un'immagine come questa

    
posta Angelos G 23.09.2016 - 10:17

3 risposte

21

Il formato Libreoffice ha il testo all'interno di una sezione compressa di un file binario, quindi cat non funziona. C'è un'opzione: lowriter --convert-to example.txt che la riconfezionerà, & amp; c'è un'opzione --print se è quello che volevi. man lowriter è informativo.

    
risposta data Mark Williams 23.09.2016 - 10:27
13

Perché non funziona come ti aspettavi

cat funziona su file di testo . Un file odt è tecnicamente (e molto semplificato) a ziped cartella contenente alcuni file xml .

In quanto tale, cat "non può essere utilizzato a questo scopo. Funziona solo su testo normale.

Cosa puoi fare invece

Potresti ovviamente estrarlo e analizzare i rispettivi file xml, ma suppongo che questo sia eccessivo per i tuoi scopi.

Un'alternativa per quello che stai provando è:

odt2txt --stdout file.odt

questo fornirà lo stesso di cat su un file txt, ma richiederà più tempo a seconda delle dimensioni del file. dovrai avere unoconv installato

sudo apt install unoconv
    
risposta data Bruni 23.09.2016 - 10:22
5

Il file odt è un pacchetto zip che include la formattazione e altre funzionalità per il documento.

Voglio vedere il contenuto di un file odt che dovresti decomprimere. Le parole effettive contenute nel documento si trovano nel file content.xml .

I documenti di parole di Microsoft (* .docx) sono dello stesso tipo di pacchetto. Il testo di una parola documenti si trova in un file di una sudirectory zippata denominata document.xml .

Ho scritto uno script per eseguire ricerche di testo sui miei documenti. Lo script richiede due argomenti per il file (nome file e testo da trovare), estrae il file in una cartella temporanea, esegue il grep del contenuto del file xml e quindi visualizza il nome file corrispondente al testo cercato.

Script di esempio per cercare tutti i file odt in una directory e le sue sottodirectory:

#!/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
    
risposta data L. D. James 23.09.2016 - 10:26

Leggi altre domande sui tag