В CentOS 8 это выражение grep
не возвращает совпадающие строки:
% dmidecode -t memory | grep -E '^[ \t]+Size: [0-9]+'
Однако этот правильно возвращает совпадающие строки (в том же дистрибутиве):
% dmidecode -t memory | grep -E '^[[:space:]]+Size: [0-9]+'
В чем причина такого поведения? Как видите, оба раза grep
вызывается в режиме расширенного регулярного выражения.
Вам не хватает -E
в первой команде grep
При публикации вопроса я пропустил «-E» в первой команде, он должен быть там, но grep не возвращает совпадающие строки.
Тогда вам нужно grep -E '^[[:blank:]]+Size: [0-9]+'
или grep -E '^[[:blank:]]+Size:[[:blank:]]+[0-9]+'
. Обратите внимание, что [ \t]
как шаблон регулярного выражения фактически эквивалентен классу символов [:blank:]
POSIX, а не [:space:]
(он также включает вертикальные пробелы).
В общем, ваша проблема, скорее всего, связана с тем, как Cent OS обрабатывает строки с одинарными кавычками при передаче их в grep
, а не с шаблоном регулярного выражения, который работает иначе.
@WiktorStribiżew Нет, это регулярное выражение. Первый просто не работает так, как думает OP.
Отвечает ли это на ваш вопрос? Какой пробел в grep является лучшим стандартом?
Отвечает ли это на ваш вопрос? grep вкладку в UNIX
Используйте [[:blank:]]
, который соответствует символу пробела и символу табуляции. Вы также можете опустить -E
:
grep '^[[:blank:]]+ Size: [0-9]+'
Ваше решение не работает. Решение OP работает с опцией -E
. В POSIX BRE +
соответствует символу плюс.
Должен быть ^[[:blank:]]\{1,\} Size: [0-9]\{1,\}
для того же эффекта в BRE.
Проблема здесь в последовательности символов \t
. Это не соответствует символу табуляции в регулярном выражении grep
, оно соответствует символу t
(не имеет значения, является ли это базовым или расширенным диалектом RE). Это не рассматривается как специальная escape-последовательность, как в некоторых других инструментах (включая GNU grep
с использованием диалекта PCRE).
Свидетель:
# printf /does/ treat \t and \n special in a format
$ printf "a\tb\n" | grep "a[ \t]b" # No match
$ printf "atb\n" | grep "a[ \t]b" # Match
atb
$ printf "a\tb\n" | grep "a[[:space:]]b" # Match
a b
$ printf "a\tb\n" | grep "a[[:blank:]]b" # Match
a b
$ printf "a\tb\n" | grep "a\sb" # Match, \s is a GNU grep extension
a b
$ printf "a\tb\n" | grep -P "a\sb" # Match, GNU grep using PCRE
a b
$ printf "a\tb\n" | grep -P "a[ \t]b" # Match, GNU grep using PCRE.
a b
В
grep '^[ \t]+Size: [0-9]+'
шаблон анализируется как POSIX BRE. Передайте флаг-E
, чтобы сделать его POSIX ERE, если вы хотите, чтобы+
анализировался как квантификатор.