我想這樣做:FINDSTR或者grep的是自動檢測chararacter編碼(UTF-16)
findstr /s /c:some-symbol *
或grep的等效
grep -R some-symbol *
,但我需要的工具來自動檢測在UTF編碼的文件-16(和朋友)並適當地搜索它們。我的文件甚至在其中有字節順序標記FFEE,所以我甚至不尋找英雄式的自動檢測。
有什麼建議嗎?
我指的是Windows Vista和XP。
我想這樣做:FINDSTR或者grep的是自動檢測chararacter編碼(UTF-16)
findstr /s /c:some-symbol *
或grep的等效
grep -R some-symbol *
,但我需要的工具來自動檢測在UTF編碼的文件-16(和朋友)並適當地搜索它們。我的文件甚至在其中有字節順序標記FFEE,所以我甚至不尋找英雄式的自動檢測。
有什麼建議嗎?
我指的是Windows Vista和XP。
根據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文件。
你沒有說你想要這樣做的平臺。
在Windows上,您可以使用PowerGREP,它會自動檢測以字節順序標記開頭的Unicode文件。 (還有一個選項可以在沒有BOM的情況下自動檢測文件,自動檢測對於UTF-8非常可靠,但僅限於UTF-16。)
感謝您的建議。我指的是Windows Vista和XP。
我也發現了這個解決方法,使用免費Sysinternals strings.exe
:
C:\> strings -s -b dir_tree_to_search | grep regexp
Strings.exe
提取它找到的所有字符串(從二進制文件,但工作得很好處理文本文件太),並預置每個結果與文件名和冒號,所以在正則表達式中考慮這一點(或使用剪切或管道中的另一個步驟)。 -s
使其執行遞歸提取,-b
只是抑制橫幅消息。
最終,我還是很驚訝,旗艦搜索實用程序Gnu grep
和findstr
本身並不處理Unicode字符編碼。
在他們的home unix環境中,UTF-16不太常見,並且文件通常是UTF-8,它們處理得很好。 – bdonlan 2009-05-17 21:13:43
也許對於提取整行來說並不是那麼好,但對於試圖找到包含字符串的所有文件(我正在嘗試這樣做)來說,這是非常完美的。謝謝。 – 2015-10-27 12:01:07
在Windows上,您也可以使用find.exe。
find /i /n "YourSearchString" *.*
唯一的問題是這個打印文件名後跟匹配。您可以通過管道過濾它們以FINDSTR
find /i /n "YourSearchString" *.* | findstr /i "YourSearchString"
不幸的是,find命令不支持像findstr這樣的匹配模式(通配符/正則表達式)。 – 2016-05-10 17:55:53
一種解決方法是轉換您的UTF-16到ASCII或ANSI
TYPE UTF-16.txt > ASCII.txt
然後你可以使用FINDSTR。
FINDSTR object ASCII.txt
findstr /s /c:some-symbol *
與編碼意識到命令下面的字符來代替:
for /r %f in (*) do @find /i /n "some-symbol" "%f"
在更高版本的Windows,UTF-16支持外的框。如果不是,請嘗試通過chcp
命令更改活動代碼頁。
在我的情況下單獨使用findstr
時不靈的UTF-16文件,但它與type
工作:
type *.* | findstr /s /c:some-symbol
您的某些文件在UTF-16和一些ASCII,還是什麼? – Artelius 2009-01-02 21:38:58
是的,一些ASCII碼,一些UTF-16。 – 2009-01-02 21:42:53