如何對全部非ASCII字符進行grep?

我有幾個很是大的XML文件,正在嘗試查找包含非ASCII字符的行。 我嘗試瞭如下方法: 正則表達式

grep -e "[\x{00FF}-\x{FFFF}]" file.xml

但這將返回文件中的每一行,不管該行是否包含指定範圍內的字符。 less

個人語法有誤仍是作錯了其餘事情? 我也嘗試過: 編碼

egrep "[\x{00FF}-\x{FFFF}]" file.xml

(用單引號和雙引號將模式引發來)。 spa


#1樓

像上面的大多數解決方案同樣,與其對非ASCII字符的字節範圍進行假設,不如對ASCII字符的實際字節範圍進行明確說明,IMO更好。 code

所以,第一個解決方案例如將變爲: xml

grep --color='auto' -P -n '[^\x00-\x7F]' file.xml

(基本上,對於十六進制ASCII範圍以外的任何字符,它都會發出聲音:從\\ x00到\\ x7F) ci

在不起做用的Mountain Lion上(因爲BSD grep中缺乏PCRE支持) ,可是經過Homebrew安裝了pcre ,如下內容一樣適用: unicode

pcregrep --color='auto' -n '[^\x00-\x7F]' file.xml

任何人均可以考慮的利弊? it


#2樓

奇怪的是,我今天必須這樣作! 我最終使用Perl是由於我沒法使grep / egrep正常工做(即便在-P模式下也是如此)。 就像是: io

cat blah | perl -en '/\xCA\xFE\xBA\xBE/ && print "found"'

對於unicode字符(例以下面的示例中的\− ),請使用如下命令:

find . ... -exec perl -CA -e '$ARGV = @ARGV[0]; open IN, $ARGV; binmode(IN, ":utf8"); binmode(STDOUT, ":utf8"); while (<IN>) { next unless /\N{U+2212}/; print "$ARGV: $&: $_"; exit }' '{}' \;

#3樓

如下對我有用:

grep -P "[\x80-\xFF]" file.xml

非ASCII字符從0x80開始,在查看字節時變爲0xFF。 Grep(和家族)不執行Unicode處理,以將多字節字符合併爲單個實體以進行正則表達式匹配。 個人grep中的-P選項容許在字符類中使用\\xdd轉義符來完成所需的操做。


#4樓

最簡單的方法是將非ASCII字符定義爲不是ASCII字符的字符。

LC_ALL=C grep '[^ -~]' file.xml

若有必要,在^後面添加一個標籤。

設置LC_COLLATE=C能夠避免在許多語言環境中出現使人討厭的字符範圍含義。 必須設置LC_CTYPE=C來匹配單字節字符-不然該命令將丟失當前編碼中的無效字節序列。 設置LC_ALL=C能夠徹底避免區域設置相關的影響。


#5樓

這是我發現的另外一個變體,它與接受的答案中的[\\x80-\\xFF]的grep搜索產生的結果徹底不一樣。 也許對找到其餘非ASCII字符的人有用:

grep --color='auto' -P -n "[^[:ascii:]]" myfile.txt

注意:個人計算機的grep(蘋果機)沒有-P選項,所以我進行了brew install grep並使用ggrep而不是grep開始了上述調用。

相關文章
相關標籤/搜索