Shell如何在
如何在 grep
中使用十六進制程式碼指定字元?
我正在使用以下命令來 grep 十六進制程式碼 0900(而不是 अ)到 097F(而不是 व)的字元集範圍。如何使用十六進制程式碼代替 अ 和 व?
bzcat archive.bz2 | grep -v '<[अ-व]*\s' | tr '[:punct:][:blank:][:digit:]' '\n' | uniq | grep -o '^[अ-व]*$' | sort -f | uniq -c | sort -nr | head -50000 | awk '{print "<w f=\""$1"\">"$2"</w>"}' > hindi.xml
我得到以下輸出:
<w f="399651">और</w> <w f="264423">एक</w> <w f="213707">पर</w> <w f="74728">कर</w> <w f="44281">तक</w> <w f="35125">कई</w> <w f="26628">द</w> <w f="23981">इन</w> <w f="22861">जब</w> ...
我只想在上面的命令中使用十六進制程式碼而不是 अ 和 व。
如果根本不可能使用十六進制程式碼,我可以使用 unicode 而不是字元集的十六進制程式碼(‘अ-व’)嗎?
我正在使用 Ubuntu 10.04
文本通常以 UTF-8 編碼;所以你必須使用 UTF-8 編碼中使用的字節的十六進制值。
grep "["$'\xe0\xa4\x85'"-"$'\xe0\xa4\xb5'"]"
和
grep '[अ-व]'
是等效的,並且它們執行基於字元類/括號表達式語言環境的匹配(即,匹配取決於梵文腳本的排序規則(即,匹配不是“\u0905 和 \0935 之間的任何字元”,而是“梵文 A 和梵文 VA 之間的任何排序”;可能存在差異。
(
$'...'
是 bash、ksh 和 zsh 的“ANSI-C 轉義字元串”語法。它只是一種更簡單的輸入字元的方法。您也可以使用\uXXXX
和\UXXXXXXXX
轉義直接詢問 bash 和 zsh 中的程式碼點。)另一方面,你有這個(注意 -P):
grep -P "\xe0\xa4[\x85-\xb5]"
這將與這些字節值進行二進制匹配。