grep
A idéia de um personagem depende da localidade . Se você estiver em um código de idioma não Unicode e fizer a grep de um arquivo com caracteres Unicode, as contagens de caracteres não corresponderão. Se você echo $LANG
vir o local em que está.
Se você definir as variáveis de ambiente LC_CTYPE
e / ou LANG
como um valor que termina com ".UTF-8", obterá o comportamento correto:
$ cat data
étuis
letter
éééééé
$ LANG=C grep -E '^.{6}$' data
étuis
letter
$ LANG=en_US.UTF_8 grep -E '^.{6}$' data
letter
éééééé
$
Você pode alterar seu código de idioma para apenas um único comando, atribuindo a variável na mesma linha que o comando.
Com essa configuração, os caracteres de vários bytes são considerados caracteres únicos. Se você deseja excluir caracteres não-ASCII completamente, algumas das outras respostas têm soluções para você.
Observe que ainda é possível que as coisas quebrem, ou pelo menos não façam exatamente o que você espera, na presença de caracteres combinados . Você grep
pode tratar CARTA LATINA PEQUENA E + COMBINANDO CARACTERES ACIMA ACIMA de forma diferente da CARTA LATINA PEQUENA E COM AGUDA.
.
, algo comowăsd's
irá corresponder'
é um caractere que pode razoavelmente fazer parte de uma "sequência com um número fixo de caracteres".LC_CTYPE
eLANG
, algo comoLC_CTYPE=en_US.UTF-8 LANG=en_US
falhará. UseLC_ALL
por segurança.Tente o seguinte:
-x
use para combinar a linha inteira e definido pelo POSIX (consulte grep ).Veja aqui uma boa explicação do que
LC_ALL
faz. Você pode definirLANG
ouLC_CTYPE
usar utf-8 para obter o mesmo comportamento. A ordem que afeta éLC_ALL
=>LANG
=>LC_CTYPE
.fonte
Com o GNU,
grep
quando construído com suporte para PCRE, você pode:Enquanto
.
corresponde a um personagem,\X
corresponde a um ideograma / graphem.Em um código de idioma UTF-8:
Nesse último
études
, existem 7 caracteres, 8 bytes e 6 grafemas.fonte
echo épée | grep -Px '\X{6}'
ouputépée
é
acima foram codificados em UTF-8).Você pode tentar algo como:
grep "^[A-Za-z]\{6\}$" myfile.txt
ou se as palavras também puderem conter números, então:
grep "^[A-Za-z0-9]\{6\}$" myfile.txt
Basta adicionar qualquer caractere aos colchetes que você deseja, além desses.
fonte
étude
todos, porque o caractere ASCII correspondente ao acento irá atrapalhar a regex.