前提知識: 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
を狙い撃ちで編集したい、としましょう。
-
word/document.xml
だけを展開する$ 7z x -y foo.docx word/document.xml
- 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
- 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
コマンドについて
※ あまり詳しくないので、間違っていたらご指摘ください。
-
7z x
: 展開 (eXtract with full paths)- アーカイブ内のディレクトリを維持したまま展開する
- Debian Linuxで7zファイルを圧縮・解凍する / p7zipの使い方 -- ぺけみさお
- x (Extract with full paths) command
-
7z u
: 更新 (Update)- 既にファイルが存在する場合は、ファイルを追加せずそのまま上書きする
- u (Update) command
「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
のみかと思っていましたが、zip
やtar.gz
なども扱えるようです。
インストール (macOS)
$ brew install p7zip
以上です。