Ich verwende den folgenden Befehl, um den Zeichensatzbereich für den Hexadezimalcode 0900 (anstelle von अ) bis 097F (anstelle von व) zu ermitteln. Wie kann ich hexadezimalen Code anstelle von अ und व verwenden?
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
Ich erhalte folgende Ausgabe:
<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>
...
Ich möchte nur hexadezimalen Code anstelle von अ und व im obigen Befehl verwenden.
Kann ich Unicode anstelle von Hexadezimalcode für den Zeichensatz ('अ-व') verwenden, wenn die Verwendung von Hexadezimalcode überhaupt nicht möglich ist?
Ich benutze Ubuntu 10.04
shell
grep
character-encoding
unicode
Dhrubo Bhattacharjee
quelle
quelle
-v
invertiert das Spiel, aus Ihrer Frage Text scheint es , dass ist nicht das, was Sie wollen.Antworten:
Schau dir diese Frage an .
Text wird normalerweise in UTF-8 codiert. Sie müssen also die hexadezimalen Werte der in der utf-8-Codierung verwendeten Bytes verwenden.
und
gleichwertig sind, und sie führen eine locale-based Matching (das heißt, Anpassung ist auf den Sortierregeln devanagari Skript abhängig (das heißt, ist der passende NICHT „jede char zwischen \ u0905 und \ 0935“ , sondern „etwas zwischen devanagari Sortier A und devanagari VA "; es kann Unterschiede geben.
Auf der anderen Seite haben Sie Folgendes (Anmerkung -P):
Dadurch wird ein binärer Abgleich mit diesen Bytewerten durchgeführt .
quelle
"["$'
und Suffix"]"
Wenn Shell-Escaping ausreicht, können Sie die folgende
$'\xHH'
Syntax verwenden:Ist das genug für Ihren Anwendungsfall?
quelle
echo 'अ-व' | hd
gibt mire0 a4 85 - e0 a4 b5
grep
keine Verknüpfung mit einer Bibliothek besteht, kann die Bereichskonvertierung vermutlich nicht von grep durchgeführt werden: - /zsh
ist in der Lage zu interpretieren"\u0900"
und"\u097F"
, aber das Verhalten wird davon abhängen, dass der UTF-8-codierte Bereich kontinuierlich ist (wahrscheinlich ist es das).Der "hexadezimale" Wert, den
0x0900
Sie geschrieben haben, ist genau der Wert des UNICODE-Codepunkts, der ebenfalls hexadezimal ist.Ich glaube , dass Sie meinen , was zu sagen ist der hexadezimale Unicode - Codepunkt:
U0905
.Das Zeichen an U-0900 ist nicht diejenige , die Sie verwendet:
अ
.Dieses Zeichen ist U0905 , Teil dieser Unicode-Seite oder auf dieser Seite aufgeführt .
In
bash
(standardmäßig in Ubuntu installiert) oder direkt mit dem Programm unter:/usr/bin/printf
(aber nicht mitsh
printf) könnte ein Unicode-Zeichen erzeugt werden mit:Dieses Zeichen, das von einer Codepunktnummer stammt, kann jedoch in Abhängigkeit von der verwendeten Codepage durch mehrere Byteströme dargestellt werden.
Es sollte offensichtlich sein, dass
\U0905
es sich0x09 0x05
um UTF-16 (UCS-2 usw.)und
0x00 0x00 0x09 0x05
UTF-32 handelt.Es mag nicht offensichtlich sein, aber in utf-8 wird es dargestellt durch
0xe0 0xa4 0x85
:Wenn das Gebietsschema Ihrer Konsole ähnlich ist
en_US.UTF-8
.Und ich spreche von der Shell, weil sie einen String in das verwandelt, was die Anwendung empfängt. Dies:
macht grep "sehen" den Charakter, den Sie brauchen.
Um die obige Zeile zu verstehen, können Sie echo verwenden:
Dann können wir einen Zeichenbereich erstellen, wie Sie es wünschen:
Das beantwortet Ihre Frage:
quelle
wir wollten das offene doppelte Anführungszeichen ohne ASCII-Zeichen und das geschlossene doppelte Anführungszeichen in reguläre doppelte Anführungszeichen (") umwandeln. Auch das einfache Anführungszeichen ohne ASCII-Zeichen sollte in reguläre einfache Anführungszeichen (') umgewandelt werden.
um sie in der Datei zu sehen (Ubuntu Bash Shell):
übersetze sie:
quelle