2012-07-12 41 views
9

我有一個完整的MS字文件的目錄結構,我必須搜索特定字符串的目錄。到目前爲止,我正在使用以下命令來搜索目錄中的文件搜索Linux中特定內容的目錄中的MS字文件

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

找到。 -name'*'-print | xargs grep'search_string'

但是,此搜索不適用於MS word文件。

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

+0

要清楚,哪個版本的Word?文件格式從Office 2003到Office 2007顯着變化。 – 2012-07-12 23:31:15

+0

@DanielDiPaolo我檢查了文件類型,它說'Microsoft Office Word 97 - 2003文檔' – JoshMachine 2012-07-12 23:32:37

回答

0

您是否嘗試過awk'/ Some | Word | In | Word /'document.docx?

+0

嘗試不起作用。 – JoshMachine 2012-07-12 23:53:54

+0

嗯,訣竅是首先提取doc文件(它包含document.xml),然後grep/awk它 – 2012-07-13 16:57:33

1

在一個.doc文件中,文本通常存在,可以通過grep找到,但文本被分解並散佈字段代碼和格式信息,因此搜索您知道的短語可能不匹配。搜索非常短的東西有更好的匹配機會。

一個.docx文件實際上是一個zip檔案的目錄結構收集幾個文件一起(嘗試重命名的.docx爲.zip然後解壓吧!) - 用zip壓縮它不太可能的grep會發現任何東西。

+0

@ Stephen P 它的一個.doc文件和超過3個字符的任何搜索不起作用。 – JoshMachine 2012-07-12 23:44:18

+0

@JoshMachine - 作爲一個測試,你可能想嘗試在其中一個'vim -bnR somefile.doc'上看看裏面有什麼,然後嘗試grep你在文件中看到的東西。 – 2012-07-13 00:07:27

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」

命令是不完美的,因爲對小文件的工作怪異文件的文件名(S)(其結果可能是untrustful),becasue一些reseaon antiword吐出這樣的文字:

「恐怕這個文件的文本流太小,無法處理。」

如果文件很小(不管它指的.o。)

+0

爲'doc',但不是'docx' – 2013-12-14 21:49:17

+0

正確(duo to * antiword * limits),也許這個https://github.com/rainey/antiword-xp-rb/wiki是答案(雖然我沒有expierience到目前爲止) – xliiv 2013-12-15 17:15:10

3

MS Word中的較新版本的點綴ASCII [0]在每個文字的目的,我還無法理解的字母之間。我寫了我自己的MS Word搜索工具,它們在搜索字段中的每個字符之間插入ascii [0],並且它工作正常。笨拙,但確定。還有很多問題。也許垃圾角色並不總是相同的。需要做更多的測試。如果有人可以編寫一個將所有這些考慮在內的工具,那將會很好。在我的Windows機器上,相同的文件對搜索響應良好。 我們可以做到!

11

我是一名翻譯,並且幾乎完全不瞭解腳本,但我對於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 

所有的改進和建議表示歡迎!

+2

這是非常令人印象深刻的。所以我可以搜索多個子文件夾和文件夾,看看裏面.doc - 我也會檢查.docx,雖然也.. – TheBlackBenzKid 2013-01-26 14:33:20

+0

我添加了對docx2使用docx2txt的支持 – 2016-09-14 13:49:00

3

下面是使用「unzip」將全部內容打印到標準輸出,然後通過管道輸出到「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 [email protected] 
do 
    unzip -p "$file" | grep -q "$findme" 
    [ $? -eq 0 ] && echo "$file" 
done 

腳本另存爲 「inword」,並在三個文件搜索 「袋熊」 有:

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

現在你知道file2.docx包含 「袋熊」。您可以通過添加對其他grep選項的支持來獲得更好的效果。玩的開心。

+0

非常方便,謝謝! – 2015-12-11 18:34:10

1

的開源命令行實用程序crgrep將搜索最MS文檔格式(我是作者)。