小ネタ: Word docxパッケージ内の特定ファイルだけを7zコマンドで展開/更新する

前提知識: Word docxファイルの中身を探検する - Office Open XML ざっくり入門 - Qiita

※ 本当は小ネタを書きたかったけど、前提知識が大きくなりすぎたので上記記事に書きました。


何がやりたいか

通常、Wordファイル foo.docx の中身をMS Wordなしで編集するには、


  • zipファイルとして展開する

  • XMLファイルを編集する(or アセットファイルを更新する)

  • zipファイルとして圧縮する

という手順を踏む必要があります。

かなり面倒なので、これを簡略化する方法を探していました。


見つけた方法: 7z コマンド (p7zip)で操作する

既にdocxのディレクトリ構造が既知で、特定ファイルだけを編集すればいいと分かっていると仮定します。

(補足 2019-03-03: foo.docx のパッケージ内のディレクトリ構造は $ 7z l foo.docx で確認できます。)

具体的には、 foo.docxのパッケージ内にあるword/document.xml を狙い撃ちで編集したい、としましょう。



  1. word/document.xml だけを展開する


    • $ 7z x -y foo.docx word/document.xml



  2. XMLを書き換える (sedなどで)


    • $ sed "s/<w:tblStyle w:val=\"TableNormal\"/<w:tblStyle w:val=\"BlueTableStyle\"/g" word\document.xml > word/document2.xml

    • $ cp word/document2.xml word/document.xml



  3. word/document.xml だけを元のdocxファイルに戻す


    • $ 7z u -y foo.docx word/document.xml



元ネタ: Custom styles for ODT (and maybe LaTeX and RST) writers · Issue #2106 · jgm/pandoc


補足: 7zコマンドについて

※ あまり詳しくないので、間違っていたらご指摘ください。

「7zip」は元々Windows用のアーカイバで、それをPOSIXシステム(Unixなど)向けに移植したのがが「p7zip」とのこと。

対応フォーマットは下記。


The program supports 7z (that implements LZMA compression algorithm), ZIP, CAB, ARJ, GZIP, BZIP2, TAR, CPIO, RPM and DEB formats.


(macOS版 p7zipのman 7zより)

7zのみかと思っていましたが、ziptar.gzなども扱えるようです。


インストール (macOS)

$ brew install p7zip

以上です。