Соответствующая строка с постоянным числом символов с помощью grep

awk игнорирует начальные пробелы при присвоении полей. Команда по умолчанию является печатью.

awk '$1 ~ /^Linux1/'

То, что Вы хотите.

Подробное объяснение:

  • 1$ говорит awk смотреть на первый "столбец".
  • ~ говорит awk делать, соответствием RegularExpression/..../является Регулярное выражение.
  • В РЕ строка Linux и специальный символ ^.
  • ^ заставляет РЕ соответствовать от запуска (в противоположность соответствию где угодно в строке).

Замеченный вместе: Awk будет соответствовать регулярному выражению "Linux" в начале первого столбца.

9
31.07.2014, 07:42
4 ответа

grep представление о персонаже является локально-зависимым . Если вы находитесь в не-юникодовой локали и grep из файла с символами Юникода в нем, то количество символов не будет совпадать. Если вы эхо $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 grep может относиться к ЛАТИННОМУ УМЛУЧШЕННОМУ ПОСЛЕДНИЮ E + СОММИНИРОВАННОМУ ХАРАКТЕРУ ДОСТУПИТЕЛЮ иначе, чем к ЛАТИННОМУ УМЛУЧЕННОМУ ПОСЛЕДНИЮ E С ПОСЛЕДНИКОМ.

4
27.01.2020, 20:07

Попробуйте это:

LC_ALL=C.UTF-8 grep -x '[_[:alnum:]]\{6\}' file

-x использовать для соответствия целой линии, и определяется POSIX (см. grep).

Смотрите здесь для хорошего объяснения того, что делает LC_ALL. Вы можете настроить LANG или LC_CTYPE на использование utf-8 для получения такого же поведения. Аффект принятия заказа составляет LC_ALL => LANG => LC_CTYPE.

2
27.01.2020, 20:07

С помощью GNU grep при сборке с поддержкой PCRE можно делать:

grep -Px '\X{6}'

While . соответствует символу, \X соответствует идеограмме/грамме.

В локали UTF-8:

$ locale charmap
UTF-8
$ printf '\u00e9tuis\n\u00e9tudes\n' | grep -Px '\X{6}'
études
$ printf 'e\u0301tuis\ne\u0301tudes\n' | grep -Px '\X{6}'
études

В последнем études имеется 7 символов, 8 байт и 6 графем.

2
27.01.2020, 20:07

Можно попробовать что-то вроде:

grep "^[A-Za-z]\{6\}$" myfile.txt

или если слова тоже могут содержать цифры, то:

grep "^[A-Za-z0-9]\{6\}$" myfile.txt

Просто добавьте в квадратные скобки любые символы, которые вам нужны в дополнение к этим.

0
27.01.2020, 20:07

Теги

Похожие вопросы