grep
Die Vorstellung eines Charakters ist vom Gebietsschema abhängig . Wenn Sie sich in einem Nicht-Unicode-Gebietsschema befinden und aus einer Datei mit Unicode-Zeichen greifen, stimmt die Anzahl der Zeichen nicht überein. Wenn Sie echo $LANG
dann sehen, sehen Sie das Gebietsschema, in dem Sie sich befinden.
Wenn Sie die Variablen LC_CTYPE
und / oder LANG
Umgebungsvariablen auf einen Wert setzen, der mit ".UTF-8" endet, erhalten Sie das richtige Verhalten:
$ cat data
étuis
letter
éééééé
$ LANG=C grep -E '^.{6}$' data
étuis
letter
$ LANG=en_US.UTF_8 grep -E '^.{6}$' data
letter
éééééé
$
Sie können Ihr Gebietsschema für nur einen Befehl ändern, indem Sie die Variable in derselben Zeile wie den Befehl zuweisen.
Bei dieser Konfiguration werden Multi-Byte-Zeichen als einzelne Zeichen betrachtet. Wenn Sie Nicht-ASCII-Zeichen vollständig ausschließen möchten, haben einige der anderen Antworten Lösungen für Sie.
Beachten Sie, dass es bei kombinierten Zeichen immer noch möglich ist, dass Dinge kaputt gehen oder zumindest nicht genau das tun, was Sie erwarten . Sie grep
können LATEINISCHEN KLEINBUCHSTABE E + KOMBINIERENDES CHARAKTER AKUT Oben anders behandeln als LATEINISCHER KLEINBUCHSTABE E MIT AKUT.
.
, wird so etwas wiewăsd's
übereinstimmen'
ist ein Zeichen, das vernünftigerweise Teil einer "Zeichenfolge mit einer festen Anzahl von Zeichen" sein kann.LC_CTYPE
und soLANG
etwasLC_CTYPE=en_US.UTF-8 LANG=en_US
wird fehlschlagen. ZurLC_ALL
Sicherheit verwenden.Versuche dies:
-x
Verwenden Sie diese Option, um die gesamte Zeile abzugleichen und von POSIX zu definieren (siehe grep ).Sehen Sie hier für eine gute Erklärung, was der
LC_ALL
Fall ist. Sie können utf-8 einstellenLANG
oderLC_CTYPE
verwenden, um das gleiche Verhalten zu erzielen. Der Auftragseingang istLC_ALL
=>LANG
=>LC_CTYPE
.quelle
Mit GNU
grep
können Sie mit PCRE-Unterstützung Folgendes tun:Stimmt
.
mit einem Zeichen\X
überein , stimmt mit einem Ideogramm / Graphem überein.In einem UTF-8-Gebietsschema:
In letzterem
études
gibt es 7 Zeichen, 8 Bytes und 6 Graphems.quelle
echo épée | grep -Px '\X{6}'
ouputépée
é
oben genannten in UTF-8 codiert wurden).Sie könnten etwas versuchen wie:
grep "^[A-Za-z]\{6\}$" myfile.txt
oder wenn die Wörter auch Zahlen enthalten können, dann:
grep "^[A-Za-z0-9]\{6\}$" myfile.txt
Fügen Sie einfach beliebige Zeichen zu den gewünschten eckigen Klammern hinzu.
quelle
étude
stimmt überhaupt nicht mit dem überein , da das dem Akzent entsprechende ASCII-Zeichen den regulären Ausdruck durcheinander bringt.