grep
Идея персонажа зависит от локали . Если вы находитесь в локали, отличной от Unicode, и выполняете поиск в файле с символами Unicode, тогда количество символов не будет совпадать. Если вы, echo $LANG
то увидите локаль, в которой находитесь.
Если вы установите для переменных среды окружения LC_CTYPE
и / или LANG
значение, заканчивающееся на «.UTF-8», то вы получите правильное поведение:
$ cat data
étuis
letter
éééééé
$ LANG=C grep -E '^.{6}$' data
étuis
letter
$ LANG=en_US.UTF_8 grep -E '^.{6}$' data
letter
éééééé
$
Вы можете изменить свой язык только для одной команды, назначив переменную в той же строке, что и команда.
В этой конфигурации многобайтовые символы рассматриваются как отдельные символы. Если вы хотите полностью исключить символы, не входящие в ASCII, у некоторых других ответов есть решения для вас.
Обратите внимание, что все еще возможно что-то сломать или, по крайней мере, сделать не совсем то, что вы ожидаете, при наличии комбинированных символов . Вы grep
можете рассматривать ЛАТИНСКОЕ МАЛЕНЬКОЕ ПИСЬМО E + КОМБИНИРУЮЩИЙ ХАРАКТЕР ОСТРОГО выше, чем ЛАТИНСКОЕ МАЛЕНЬКОЕ ПИСЬМО Е С ОСТРЫМ.
.
, что-то вродеwăsd's
будет соответствовать'
символ, который может быть разумно частью «строки с фиксированным количеством символов».LC_CTYPE
иLANG
, что-то подобноеLC_CTYPE=en_US.UTF-8 LANG=en_US
не удастся. ИспользуйтеLC_ALL
для безопасности.Попробуй это:
-x
использовать для сопоставления всей строки и определяется POSIX (см. grep ).Смотрите здесь для хорошего объяснения того, что
LC_ALL
делает. Вы можете установитьLANG
илиLC_CTYPE
использовать utf-8, чтобы получить то же поведение. Эффект принятия заказа:LC_ALL
=>LANG
=>LC_CTYPE
.источник
С GNU
grep
при поддержке PCRE вы можете делать:Пока
.
соответствует персонажу,\X
соответствует идеограмме / графему.В стандарте UTF-8:
В последнем
études
есть 7 символов, 8 байтов и 6 графем.источник
echo épée | grep -Px '\X{6}'
Ouputépée
é
вышеперечисленные были закодированы в UTF-8).Вы можете попробовать что-то вроде:
grep "^[A-Za-z]\{6\}$" myfile.txt
или если слова тоже могут содержать числа, то:
grep "^[A-Za-z0-9]\{6\}$" myfile.txt
Просто добавьте любые символы в квадратные скобки, которые вы хотите в дополнение к этим.
источник
étude
вообще, потому что символ ASCII, соответствующий акценту, испортит регулярное выражение.