grep
L'idée d'un caractère dépend des paramètres régionaux . Si vous êtes dans un environnement local non Unicode et que vous récupérez à partir d'un fichier contenant des caractères Unicode, le nombre de caractères ne correspondra pas. Si vous voyez echo $LANG
alors les paramètres régionaux dans lesquels vous vous trouvez.
Si vous définissez les variables d'environnement LC_CTYPE
et / ou LANG
une valeur se terminant par ".UTF-8", vous obtiendrez le bon comportement:
$ cat data
étuis
letter
éééééé
$ LANG=C grep -E '^.{6}$' data
étuis
letter
$ LANG=en_US.UTF_8 grep -E '^.{6}$' data
letter
éééééé
$
Vous pouvez modifier vos paramètres régionaux pour une seule commande en affectant la variable sur la même ligne que la commande.
Avec cette configuration, les caractères multi-octets sont considérés comme des caractères uniques. Si vous souhaitez exclure entièrement les caractères non ASCII, certaines des autres réponses ont des solutions pour vous.
Notez qu'il est toujours possible que les choses se cassent, ou du moins ne fassent pas exactement ce que vous attendez, en présence de combinaisons de personnages . Vous grep
pouvez traiter la LETTRE MINUSCULE LATINE E + COMBINANT LE CARACTÈRE AIGU CI-DESSUS différemment de la LETTRE MINUSCULE LATINE E AIGU.
.
, quelque chose commewăsd's
va correspondre'
est un caractère qui peut raisonnablement faire partie d'une "chaîne avec un nombre fixe de caractères".LC_CTYPE
etLANG
, quelque chose commeLC_CTYPE=en_US.UTF-8 LANG=en_US
sera échoué. UtilisezLC_ALL
pour la sécurité.Essaye ça:
-x
utiliser pour correspondre à toute la ligne, et défini par POSIX (voir grep ).Voir ici pour une bonne explication de ce qui se
LC_ALL
passe. Vous pouvez définirLANG
ouLC_CTYPE
utiliser utf-8 pour obtenir le même comportement. L'ordre prenant effet estLC_ALL
=>LANG
=>LC_CTYPE
.la source
Avec GNU
grep
lorsqu'il est construit avec le support PCRE, vous pouvez faire:Tandis que
.
correspond à un caractère,\X
correspond à un idéogramme / graphème.Dans un environnement local UTF-8:
Dans ce dernier
études
, il y a 7 caractères, 8 octets et 6 graphèmes.la source
echo épée | grep -Px '\X{6}'
ouputépée
é
ci-dessus ont été encodés en UTF-8).Vous pouvez essayer quelque chose comme:
grep "^[A-Za-z]\{6\}$" myfile.txt
ou si les mots peuvent aussi contenir des nombres, alors:
grep "^[A-Za-z0-9]\{6\}$" myfile.txt
Ajoutez simplement les caractères aux crochets que vous souhaitez en plus de ceux-ci.
la source
étude
tout, car le caractère ASCII correspondant à l'accent gâchera l'expression régulière.