我有一个充满 MS Word 文件的目录结构,我必须在目录中搜索特定的字符串。到目前为止,我一直在使用以下命令在目录中搜索文件
寻找 。-exec grep -li 'search_string' {} \;
寻找 。-name '*' -打印 | xargs grep 'search_string'
但是,此搜索不适用于 MS word 文件。
是否可以在 Linux 中的 MS word 文件中进行字符串搜索?
我是一名翻译,对脚本几乎一无所知,但我对 grep 无法扫描 Word .doc 文件感到非常恼火,因此我想出了如何制作这个小 shell 脚本以使用 catdoc 和 grep 搜索目录给定输入字符串的 .doc 文件。
您需要安装catdoc
和docx2txt
打包
#!/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
欢迎所有改进和建议!
这是一种使用“解压缩”将整个内容打印到标准输出的方法,然后通过管道传输到“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 选项的支持来获得更好的体验。玩得开心。
最新版本的 MS Word 将 ascii[0] 散布在文本的每个字母之间,用于我尚无法理解的目的。我编写了自己的 MS Word 搜索实用程序,在搜索字段中的每个字符之间插入 ascii[0],它工作得很好。笨拙但还可以。还有很多问题。也许垃圾字符并不总是相同的。需要做更多的测试。如果有人可以编写一个将所有这些考虑在内的实用程序,那就太好了。在我的 Windows 机器上,相同的文件对搜索响应良好。我们能做到!
在.doc
文件中,文本通常存在并且可以通过 grep 找到,但是该文本被分解并散布有域代码和格式信息,因此搜索您知道的短语可能不匹配。搜索非常短的内容有更好的匹配机会。
.docx
文件实际上是在一个目录结构中收集多个文件的存档zip
(尝试将 .docx 重命名为 .zip 然后解压缩它!)——使用 zip 压缩,grep 不太可能找到任何东西。
开源命令行实用程序crgrep将搜索大多数 MS 文档格式(我是作者)。
如果您安装了名为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.)
如果文件不多,您可以编写一个包含 catdoc 之类的脚本:http://manpages.ubuntu.com/manpages/gutsy/man1/catdoc.1.html ,通过循环遍历每个文件,执行 catdoc 和 grep ,将其存储在 bash 变量中,如果满意则将其输出。
我遇到的最佳解决方案是使用unoconv
将 word 文档转换为 html。它也有一个 .txt 输出,但在我的情况下它删除了内容。
您是否尝试过awk '/Some|Word|In|Word/' document.docx ?
我找到了一种使用 ripgrep 的预处理器功能来搜索 Word 文件 (doc
和) 的方法。docx
这取决于正在安装的以下内容:
#!/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.