18

我有一个充满 MS Word 文件的目录结构,我必须在目录中搜索特定的字符串。到目前为止,我一直在使用以下命令在目录中搜索文件

寻找 。-exec grep -li 'search_string' {} \;

寻找 。-name '*' -打印 | xargs grep 'search_string'

但是,此搜索不适用于 MS word 文件。

是否可以在 Linux 中的 MS word 文件中进行字符串搜索?

4

10 回答 10

30

我是一名翻译,对脚本几乎一无所知,但我对 grep 无法扫描 Word .doc 文件感到非常恼火,因此我想出了如何制作这个小 shell 脚本以使用 catdoc 和 grep 搜索目录给定输入字符串的 .doc 文件。

您需要安装catdocdocx2txt打包

#!/bin/bash
echo -e "\n
Welcome to scandocs. This will search .doc AND .docx files in this directory for a given string. \n
Type in the text string you want to find... \n"
read response
find . -name "*.doc" | 
while read i; do catdoc "$i" | 
grep --color=auto -iH --label="$i" "$response"; done
find . -name "*.docx" | 
while read i; do docx2txt < "$i" | 
grep --color=auto -iH --label="$i" "$response"; done

欢迎所有改进和建议!

于 2013-01-26T14:15:06.650 回答
6

这是一种使用“解压缩”将整个内容打印到标准输出的方法,然后通过管道传输到“grep -q”以检测输出中是否存在所需的字符串。它适用于 docx 格式文件。

#!/bin/bash
PROG=`basename $0`

if [ $# -eq 0 ]
then
  echo "Usage: $PROG string file.docx [file.docx...]"
  exit 1
fi

findme="$1"
shift

for file in $@
do
  unzip -p "$file" | grep -q "$findme"
  [ $? -eq 0 ] && echo "$file"
done

将脚本保存为“inword”并在三个文件中搜索“wombat”:

$ ./inword wombat file1.docx file2.docx file3.docx
file2.docx

现在您知道 file2.docx 包含“wombat”。您可以通过添加对其他 grep 选项的支持来获得更好的体验。玩得开心。

于 2014-06-12T01:26:31.733 回答
4

最新版本的 MS Word 将 ascii[0] 散布在文本的每个字母之间,用于我尚无法理解的目的。我编写了自己的 MS Word 搜索实用程序,在搜索字段中的每个字符之间插入 ascii[0],它工作得很好。笨拙但还可以。还有很多问题。也许垃圾字符并不总是相同的。需要做更多的测试。如果有人可以编写一个将所有这些考虑在内的实用程序,那就太好了。在我的 Windows 机器上,相同的文件对搜索响应良好。我们能做到!

于 2012-11-29T06:28:29.393 回答
3

.doc文件中,文本通常存在并且可以通过 grep 找到,但是该文本被分解并散布有域代码和格式信息,因此搜索您知道的短语可能不匹配。搜索非常短的内容有更好的匹配机会。

.docx文件实际上是在一个目录结构中收集多个文件的存档zip(尝试将 .docx 重命名为 .zip 然后解压缩它!)——使用 zip 压缩,grep 不太可能找到任何东西。

于 2012-07-12T23:35:47.867 回答
1

开源命令行实用程序crgrep将搜索大多数 MS 文档格式(我是作者)。

于 2015-04-22T09:59:11.973 回答
0

如果您安装了名为antiword的程序,您可以使用以下命令:

find -iname "*.doc" |xargs -I {} bash -c 'if (antiword {}|grep "string_to_search") > /dev/null 2>&1; then echo {} ; fi'

用您的文本替换上述命令中的“string_to_search”。此命令吐出包含“string_to_search”的文件的文件名

该命令并不完美,因为在小文件上工作很奇怪(结果可能是不可信的),因为某些反义词会吐出以下文本:

“恐怕这个文件的文本流太小了,无法处理。”

如果文件很小(不管它是什么意思 .o.)

于 2012-09-20T19:47:27.857 回答
0

如果文件不多,您可以编写一个包含 catdoc 之类的脚本:http://manpages.ubuntu.com/manpages/gutsy/man1/catdoc.1.html 通过循环遍历每个文件,执行 catdoc 和 grep ,将其存储在 bash 变量中,如果满意则将其输出。

于 2012-07-13T00:05:56.173 回答
0

我遇到的最佳解决方案是使用unoconv将 word 文档转换为 html。它也有一个 .txt 输出,但在我的情况下它删除了内容。

http://linux.die.net/man/1/unoconv

于 2014-11-03T18:05:23.817 回答
0

您是否尝试过awk '/Some|Word|In|Word/' document.docx ?

于 2012-07-12T23:32:51.047 回答
0

我找到了一种使用 ripgrep 的预处理器功能来搜索 Word 文件 (doc和) 的方法。docx

这取决于正在安装的以下内容:

  • ripgrep(更多关于预处理器的信息在这里
  • 自由办公室
  • docx2txt
  • 这个 catdoc2 脚本,我已添加到我的$PATH
#!/bin/bash

temp_dir=$(mktemp -d)
trap "rm $temp_dir/* && rmdir $temp_dir" 0 2 3 15

libreoffice --headless --convert-to "txt:Text (encoded):UTF8" --outdir ${temp_dir} $1 1>/dev/null
cat ${temp_dir}/$(basename -s .doc $1).txt

一级递归搜索的命令模式是:

$ rg --pre <preprocessor> --glob <glob with filetype> <search string> 

例子:

$ ls *
one:
a.docx

two:
b.docx  c.doc
$ rg --pre docx2txt --glob *.docx This
two/b.docx
1:This is file b.

one/a.docx
1:This is file a.
$ rg --pre catdoc2 --glob *.doc This
two/c.doc
1:This is file c.
于 2021-04-13T03:16:38.570 回答