Wie ersetze ich ein Wort in einer .DOCX-Datei mithilfe der Linux-Befehlszeile?

7

Ich möchte ein Wort in einer DOCX-Datei mit einem Shell-Befehl ändern. Ich habe versucht, den sedBefehl zu verwenden, aber er funktioniert nicht. Kennt jemand eine Lösung dafür?

Zum Beispiel möchte ich ein Wort (z. B. exp5) ändern und dieses durch ein anderes ( exp3) in der Datei ersetzen exo.docx.

Deepshikha
quelle
Entschuldigung, exp5 mit exp3
deepshikha
3
Sie können Ihre Fragen bearbeiten.
Raphael Ahrens
7
.docxist eigentlich ein Archiv im Zip-Format. Extrahieren Sie die word/document.xmlDatei daraus, wenden Sie das sed darauf an und fügen Sie es wieder dem Archiv hinzu. Wikipedia hat weitere Informationen zum Format.
Nominelles Tier
2
@Dmitry Es gibt viele triftige Gründe, die uns weit vom Thema entfernen würden. Ich bin sicher, Google wird Ihnen helfen
Darren H
1
@DarrenH Ich habe nicht nach "vielen gültigen Gründen" gefragt, nur aus dem Grund, den das OP hatte.
Dmitry Grigoryev

Antworten:

19

Sie möchten also Dinge in einem markenspezifischen Format ersetzen? Auf den ersten Blick sieht es schlecht aus, aber das neue docxFormat ist dafür etwas besser als das alte docFormat, da es sich tatsächlich um eine ZIP-Datei handelt, die XMLDateien enthält.

Die Antwort liegt also darin, es zu entpacken. Dann müssen Sie die Dateien durchsuchen und herausfinden, welche Sie aufrufen sedund erneut komprimieren können .

Überprüfen Sie die Datei word/document.xmlin der ZIP-Datei.

Orion
quelle
eine Randnotiz: "mc" (Mitternachtskommando) kann die Verzeichnisse und Dateien einer Zip-Datei nahtlos öffnen und "innerhalb" gehen. Sie sollten in der Lage sein, mc (mc) zu starten, dann zu der Datei zu navigieren, sie einzugeben, um ihren Inhalt einzugeben, dann die relevante Datei zu finden, die Sie ändern müssen, sie zu bearbeiten (F3, wenn mein Speicher korrekt ist? Das Menü sollte sich am unteren Rand Ihres Bildschirms befinden) Speichern Sie es und beenden Sie es (navigieren Sie nach oben, bis Sie die ZIP-Datei "beenden"): Es wird gefragt, ob Sie die Änderungen speichern möchten. Damit dies funktioniert, müssen Sie möglicherweise "mc" anweisen, .docx- und .xlsx-Dateien als Zip-Dateien zu behandeln
Olivier Dulac
4
Ich habe Albträume über sedauf XML ....
Katze
4
@cat so etwas , nehme ich an
Digital Trauma
@DigitalTrauma Ja, eher so, obwohl sedes nicht reguläre Grammatiken beschreiben kann, oder? Also vielleicht ist es nicht ganz so schlimm (aber benutze einen Parser!)
Katze
1
Das Ersetzen eines einzelnen Wortes sollte wahrscheinlich in Ordnung sein, wenn es nicht als Tag-Name vorkommt, aber im Allgemeinen ist die Verwendung von Regex in XML aus grammatikalischer Sicht unangemessen und falsch. Ich weiß nicht, was OP will - wenn es ein automatisches Skript sein muss, kommt die Verwendung eines Dateimanagers und eines Texteditors nicht in Frage.
Orion
3

Versuchen Sie dieses Skript:

FILE=$1    
RETPATH=`pwd`    
rm -rf /var/tmp/docx    
mkdir /var/tmp/docx    
cp $FILE /var/tmp/docx
cd /var/tmp/docx    
mkdir tmp
unzip $FILE -d tmp
cd tmp/word
sed -i "s/${2}/${3}/" document.xml
cd ..
zip -r ../${FILE} *
cp /var/tmp/docx/${FILE} ${RETPATH}
cd $RETPATH
rm -rf /var/tmp/docx 

und rufen Sie das Skript wie folgt auf:

./repdocx FILE_NAME OLD_STRING NEW_STRING
schraubenkarl
quelle
Wenn Sie OSX verwenden, vergessen Sie nicht, sed -i ''
Ian Newland
1

Ändern und Reinigung schraubenkarl ‚s Antwort (im Verzeichnis des docx sein muss):

find_and_replace() {
    FILE=$1
    FIND=$2
    REPLACE=$3

    unzip $FILE -d tmp #unzip
    sed -i '' -e "s/${FIND}/${REPLACE}/g" tmp/word/document.xml #find/replace
    cd tmp && zip -r ../$i * && cd .. #zip
    rm -rf tmp
}
Makavenne
quelle