2009-01-02 56 views
11

我想這樣做:FINDSTR或者grep的是自動檢測chararacter編碼(UTF-16)

findstr /s /c:some-symbol * 

或grep的等效

grep -R some-symbol * 

,但我需要的工具來自動檢測在UTF編碼的文件-16(和朋友)並適當地搜索它們。我的文件甚至在其中有字節順序標記FFEE,所以我甚至不尋找英雄式的自動檢測。

有什麼建議嗎?


我指的是Windows Vista和XP。

+0

您的某些文件在UTF-16和一些ASCII,還是什麼? – Artelius 2009-01-02 21:38:58

+0

是的,一些ASCII碼,一些UTF-16。 – 2009-01-02 21:42:53

回答

0

根據Damon Cortesi的blog article grep不能使用UTF-16文件,正如你發現的那樣。然而,它提出了這個解決方法:

for f in `find . -type f | xargs -I {} file {} | grep UTF-16 | cut -f1 -d\:` 
     do iconv -f UTF-16 -t UTF-8 $f | grep -iH --label=$f ${GREP_FOR} 
done 

這顯然是對於Unix,不知道Windows上的等價物是什麼。該文章的作者還提供了一個shell腳本來完成上述工作,您可以在github here上找到。

這隻會擦除UTF-16文件。你也可以用普通的方式來擦寫你的ASCII文件。

0

你沒有說你想要這樣做的平臺。

在Windows上,您可以使用PowerGREP,它會自動檢測以字節順序標記開頭的Unicode文件。 (還有一個選項可以在沒有BOM的情況下自動檢測文件,自動檢測對於UTF-8非常可靠,但僅限於UTF-16。)

4

感謝您的建議。我指的是Windows Vista和XP。

我也發現了這個解決方法,使用免費Sysinternals strings.exe

C:\> strings -s -b dir_tree_to_search | grep regexp 

Strings.exe提取它找到的所有字符串(從二進制文件,但工作得很好處理文本文件太),並預置每個結果與文件名和冒號,所以在正則表達式中考慮這一點(或使用剪切或管道中的另一個步驟)。 -s使其執行遞歸提取,-b只是抑制橫幅消息。

最終,我還是很驚訝,旗艦搜索實用程序Gnu grepfindstr本身並不處理Unicode字符編碼。

+0

在他們的home unix環境中,UTF-16不太常見,並且文件通常是UTF-8,它們處理得很好。 – bdonlan 2009-05-17 21:13:43

+0

也許對於提取整行來說並不是那麼好,但對於試圖找到包含字符串的所有文件(我正在嘗試這樣做)來說,這是非常完美的。謝謝。 – 2015-10-27 12:01:07

3

在Windows上,您也可以使用find.exe。

find /i /n "YourSearchString" *.* 

唯一的問題是這個打印文件名後跟匹配。您可以通過管道過濾它們以FINDSTR

find /i /n "YourSearchString" *.* | findstr /i "YourSearchString" 
+0

不幸的是,find命令不支持像findstr這樣的匹配模式(通配符/正則表達式)。 – 2016-05-10 17:55:53

1

一種解決方法是轉換您的UTF-16到ASCII或ANSI

TYPE UTF-16.txt > ASCII.txt 

然後你可以使用FINDSTR。

FINDSTR object ASCII.txt 
2
findstr /s /c:some-symbol * 

與編碼意識到命令下面的字符來代替:

for /r %f in (*) do @find /i /n "some-symbol" "%f" 
1

在更高版本的Windows,UTF-16支持外的框。如果不是,請嘗試通過chcp命令更改活動代碼頁。

在我的情況下單獨使用findstr時不靈的UTF-16文件,但它與type工作:

type *.* | findstr /s /c:some-symbol