我有一个充满MS word文件的目录结构,我必须在目录中搜索特定的字符串。到目前为止,我使用以下命令在目录中搜索文件
找到。 -exec grep -li'search_string'{} \; 找到。 -name'*' - print | xargs grep'search_string'
但是,此搜索不适用于MS word文件。
是否可以在Linux中的MS word文件中进行字符串搜索?
答案 0 :(得分:13)
我是一名翻译,几乎不知道脚本编写,但我很生气,因为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
欢迎所有改进和建议!
答案 1 :(得分:3)
最新版本的MS Word在文本的每个字母之间插入了ascii [0],目的是我无法理解。我编写了自己的MS Word搜索实用程序,在搜索字段中的每个字符之间插入ascii [0],它工作正常。笨拙但还行。还有很多问题。也许垃圾字符并不总是一样的。需要做更多的测试。如果有人能够编写一个能够将所有这些都考虑在内的实用程序,那就太好了。在我的Windows机器上,相同的文件对搜索反应良好。 我们能做到!
答案 2 :(得分:3)
这是一种使用&#34; unzip&#34;的方法。将整个内容打印到标准输出,然后输送到&#34; grep -q&#34;检测输出中是否存在所需的字符串。它适用于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
将脚本保存为&#34; inword&#34;并搜索&#34; wombat&#34;在三个文件中:
$ ./inword wombat file1.docx file2.docx file3.docx
file2.docx
现在你知道file2.docx包含&#34; wombat&#34;。您可以通过添加对其他grep选项的支持来获得更好的体验。玩得开心。
答案 3 :(得分:1)
在.doc
文件中,文本通常存在并且可以通过grep找到,但该文本被分解并散布着字段代码和格式信息,因此搜索您知道的短语可能不匹配。搜索非常短的东西有更好的匹配机会。
.docx
文件实际上是一个zip
存档,在目录结构中收集几个文件(尝试将.docx重命名为.zip然后解压缩它!) - 使用zip压缩它不太可能是grep会找到任何东西。
答案 4 :(得分:1)
opensource命令行实用程序crgrep将搜索大多数MS文档格式(我是作者)。
答案 5 :(得分:0)
你试过 awk '/某些| Word | In | Word /'document.docx?
答案 6 :(得分:0)
如果文件不是太多,你可以编写一个包含catdoc:http://manpages.ubuntu.com/manpages/gutsy/man1/catdoc.1.html之类的脚本,循环遍历每个文件,执行catdoc和grep,将其存储在bash变量中,如果是的话输出它令人满意的。
答案 7 :(得分: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。)
答案 8 :(得分:0)
我遇到的最佳解决方案是使用unoconv
将word文档转换为html。它也有一个.txt输出,但在我的情况下丢弃了内容。
答案 9 :(得分:0)
我找到了一种使用 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.