Używam następującego polecenia do grep zakresu zestawu znaków dla kodu szesnastkowego 0900 (zamiast अ) do 097F (zamiast व). Jak mogę użyć kodu szesnastkowego zamiast अ i व?
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
Otrzymuję następujące dane wyjściowe:
<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>
...
Chcę tylko użyć kodu szesnastkowego zamiast अ i व w powyższym poleceniu.
Jeśli użycie kodu szesnastkowego nie jest w ogóle możliwe, czy mogę użyć kodu Unicode zamiast kodu szesnastkowego dla zestawu znaków („अ-व”)?
Używam Ubuntu 10.04
shell
grep
character-encoding
unicode
Dhrubo Bhattacharjee
źródło
źródło
-v
odwraca dopasowanie, z tekstu pytania wydaje się, że nie jest to, czego chcesz.Odpowiedzi:
Spójrz na to pytanie .
Tekst jest zwykle kodowany w UTF-8; więc musisz użyć wartości szesnastkowych bajtów używanych w kodowaniu utf-8.
i
są równoważne i wykonują dopasowanie oparte na ustawieniach regionalnych (tzn. dopasowanie jest zależne od reguł sortowania skryptu devanagari (to znaczy, że dopasowanie to NIE jest „dowolny znak między \ u0905 a \ 0935”, ale „wszystko sortuje między devanagari A i devanagari VA ”; mogą występować różnice.
Z drugiej strony masz to (uwaga -P):
spowoduje to dopasowanie binarne z tymi wartościami bajtów .
źródło
"["$'
i sufiks"]"
Jeśli ucieczka powłoki jest wystarczająca, możesz użyć następującej
$'\xHH'
składni:Czy to wystarczy dla twojego przypadku użycia?
źródło
echo 'अ-व' | hd
daje mie0 a4 85 - e0 a4 b5
grep
nie jest związane z żadnym lib, chyba że nie jest możliwe, aby konwersja zakres przeprowadzić grep: - /zsh
jest w stanie interpretować"\u0900"
i"\u097F"
, ale zachowanie będzie zależeć od ciągłości zakodowanego UTF-8 (prawdopodobnie tak jest).Zapisana wartość „szesnastkowa”
0x0900
jest dokładnie wartością punktu kodowego UNICODE, również w systemie szesnastkowym.Wierzę, że to, co chcesz powiedzieć, jest to kod szesnastkowy punkt UNICODE:
U0905
.Znak U-0900 nie jest jeden użyłeś:
अ
.Ten znak to U0905 , część tej strony Unicode lub wymieniony na tej stronie .
W
bash
(instalowany domyślnie w Ubuntu) lub bezpośrednio z programem w:/usr/bin/printf
(ale nie zsh
printf) znak Unicode można utworzyć za pomocą:Jednak ten znak, który pochodzi z numeru punktu kodowego, może być reprezentowany przez kilka strumieni bajtów, w zależności od używanej strony kodowej.
Powinno być oczywiste, że
\U0905
jest0x09 0x05
w UTF-16 (UCS-2 itp.)I
0x00 0x00 0x09 0x05
w UTF-32.To może nie być oczywiste, ale w utf-8 jest reprezentowane przez
0xe0 0xa4 0x85
:Jeśli ustawienia regionalne konsoli są podobne
en_US.UTF-8
.Mówię o powłoce, ponieważ jest to ta, która przekształca ciąg znaków w to, co otrzymuje aplikacja. To:
sprawia, że grep „widzi” potrzebną postać.
Aby zrozumieć powyższą linię, możesz użyć echa:
Następnie możemy zbudować zakres postaci, zgodnie z twoją prośbą:
To odpowiada na twoje pytanie:
źródło
chcieliśmy przekonwertować otwartą podwójną wycenę i zamknij podwójną wycenę na zwykłe podwójne cytaty („). Także pojedynczą wycenę non-ascii na zwykłą pojedynczą wycenę (').
aby zobaczyć je w pliku (powłoka bash Ubuntu):
przetłumacz je:
źródło