我有幾個很是大的XML文件,正在嘗試查找包含非ASCII字符的行。 我嘗試瞭如下方法: 正則表達式
grep -e "[\x{00FF}-\x{FFFF}]" file.xml
但這將返回文件中的每一行,不管該行是否包含指定範圍內的字符。 less
個人語法有誤仍是作錯了其餘事情? 我也嘗試過: 編碼
egrep "[\x{00FF}-\x{FFFF}]" file.xml
(用單引號和雙引號將模式引發來)。 spa
像上面的大多數解決方案同樣,與其對非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
奇怪的是,我今天必須這樣作! 我最終使用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 }' '{}' \;
如下對我有用:
grep -P "[\x80-\xFF]" file.xml
非ASCII字符從0x80開始,在查看字節時變爲0xFF。 Grep(和家族)不執行Unicode處理,以將多字節字符合併爲單個實體以進行正則表達式匹配。 個人grep中的-P
選項容許在字符類中使用\\xdd
轉義符來完成所需的操做。
最簡單的方法是將非ASCII字符定義爲不是ASCII字符的字符。
LC_ALL=C grep '[^ -~]' file.xml
若有必要,在^
後面添加一個標籤。
設置LC_COLLATE=C
能夠避免在許多語言環境中出現使人討厭的字符範圍含義。 必須設置LC_CTYPE=C
來匹配單字節字符-不然該命令將丟失當前編碼中的無效字節序列。 設置LC_ALL=C
能夠徹底避免區域設置相關的影響。
這是我發現的另外一個變體,它與接受的答案中的[\\x80-\\xFF]
的grep搜索產生的結果徹底不一樣。 也許對找到其餘非ASCII字符的人有用:
grep --color='auto' -P -n "[^[:ascii:]]" myfile.txt
注意:個人計算機的grep(蘋果機)沒有-P
選項,所以我進行了brew install grep
並使用ggrep
而不是grep
開始了上述調用。