cat Befehl zeigt nicht die Zeilen des Textes [duplizieren]

8

Ich versuche eine Odt-Datei vom Terminal zu lesen. Wenn ich cat myfile.odt eintippe, zeigt es mir ein Bild wie dieses

    
Angelos G 23.09.2016, 10:17

3 Antworten

21

Das Libreoffice-Format enthält den Text innerhalb eines komprimierten Abschnitts einer Binärdatei, so dass cat nicht funktioniert. Es gibt eine Option: lowriter --convert-to example.txt , die es neu packt, & amp; Es gibt eine Option --print, wenn Sie das wollten. man lowriter ist informativ.

    
Mark Williams 23.09.2016 10:27
13

Warum es nicht wie erwartet funktioniert

cat funktioniert auf Textdateien . Eine odt Datei ist technisch (und sehr vereinfacht) eine ziped Ordner mit einigen xml Dateien.

Als solche kann Katze nicht für diesen Zweck verwendet werden. Es funktioniert nur mit Nur-Text.

Was Sie stattdessen tun können

Sie könnten es natürlich extrahieren und die entsprechenden XML-Dateien parsen, aber ich denke, das ist für Ihre Zwecke übertrieben.

Eine Alternative für das, was Sie versuchen, ist:

odt2txt --stdout file.odt

Dies liefert dasselbe wie cat für eine TXT-Datei, dauert je nach Größe der Datei jedoch länger. Sie müssen unoconv installiert haben

sudo apt install unoconv
    
Bruni 23.09.2016 10:22
5

Die odt-Datei ist ein Zip-Paket, das Formatierung und andere Funktionen für das Dokument enthält.

Ich möchte den Inhalt einer odt-Datei sehen, die Sie entpacken müssen. Die tatsächlichen Wörter im Dokument befinden sich in der Datei content.xml .

Micosoft-Word-Dokumente (* .docx) sind vom gleichen Pakettyp. Der Text eines Word-Dokuments befindet sich in einer Datei eines komprimierten sudirectory namens document.xml .

Ich habe ein Skript geschrieben, um eine Textsuche für meine Dokumente durchzuführen. Das Skript benötigt zwei Argumente für die Datei (Dateiname und zu suchenden Text), extrahiert die Datei in einen temporären Ordner, grep den Inhalt der XML-Datei und zeigt den Dateinamen an, der dem gesuchten Text entspricht.

Beispielskript zum Durchsuchen aller odt-Dateien in einem Verzeichnis und seiner Unterverzeichnisse:

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

Tags und Links