出于某种需求,有时候我们需要将大量的word文件转化为txt格式的文件,如果只是一两个文件,可以采用复制粘贴的方式,或者采用”打开文件”,另存为”纯文本”的方式,但是一旦文件的数量成百上千,上述的手动操作方法就不是常人能忍受的。所以,需要一种批量处理方式,将word文件自动转化为txt文件。

本文采用基本的linux shell命令,构建一只有几行代码的脚本,批量自动化地将每个docx文件转化为对应地txt文件。要注意的事情:1.如果你使用的是windows系统,可以安装Cygwin程序来模拟运行本文提到的shell命令;2.本文的脚本只能处理docx文件,不能处理doc文件,可以事先批量的将doc转化为docx格式,再按照本文的方法处理。

1、word2txt.sh脚本的使用

将该脚本和要转换的所有docx文件放置到同一个目录下,然后在Cygwin命令行终端运行如下命令即可:./word2txt.sh。如果没有发生任何错误,同一目录中就会生成每个docx文件对应的txt文件。脚本word2txt.sh完整的代码如下:

1
2
3
4
5
6
#!/bin/bash
find -type f -regex “.*\.\(docx\)” | while read line
do
name=${line%.*}
unzip -p $line word/document.xml | sed -e ‘s/<\/w:p>/\n/g; s/<[^>]\{1,\}>//g; s/[^[:print:]\n]\{1,\}//g’ > $name.txt
done

该脚本的主要功能实现在unzip开始的语句,通过unzip将docx文件转化为xml格式,再经管道符号由sed命令进行处理,最后将提取到的信息重定向到对应的.txt文件中。

这条主功能语句运行的效果如图1所示,左边是word文件包含三句话,右边是命令执行后,将这三句话抽取出来。要注意的是,抽取出来的文字不保留格式的,不管是docx中的字体大小还是颜色等,这些格式信息都会丢失,如图2所示。

图1 unzip对应语句的执行效果

图2 脚本的输出不保留字体大小、颜色和表格结构

2、其他可能的问题:
  1. 生成的txt文件和docx夹杂在同一个目录中,如果想让两者分开到不同的目录,可以修改脚本的重定向符后面的txt文件名;也可以使用”mv *.txt”命令;

  2. Cygwin的安装过程可以参照此处

  3. 如果你不想安装Cygwin,也可以直接从find, sed, unzip等软件的windows版本开始构建,当然脚本要参照windows的bat格式书写,而不是linux的shell格式。下面给出find,sed,unzip等命令的windows安装包的官方字体,请自行下载,并构建bat脚本。

a)zip for windows:

http://gnuwin32.sourceforge.net/packages/unzip.htm

b) sed for windows:

http://gnuwin32.sourceforge.net/packages/sed.htm

c) find for windows:

http://gnuwin32.sourceforge.net/packages/findutils.htm