Intereting Posts
Мой flashplugin-nonfree (на Debian Stretch) устарел … что делать? Что, если я установлю DPI больше, чем PPI монитора в gnome, используя xrandr? Как фильтровать файлы с именем файла, а затем удалять файл OLDEST? Разделить переменную на число? Разрешения на монтирование всегда заблокированы DHCP и корневая файловая система только для чтения Почему система вернулась к старым данным после перестройки raid 1 Как установить VLC 1.1.10 или 1.1.9 в CentOS 5.6 или CentOS 6.0? Увеличьте размер раздела с помощью свободного пространства, разделенного другим разделом Linux маршрутизирует две разные сети с двумя разными шлюзами Не удалось обновить драйвер NVIDIA Как работает опция -fuzzy для rsync? одномерный массив в оболочке, не работающий для индексов больше 08 Как использовать быструю замену для замены всех строк предыдущей команды? как понимать список звуковых карт; значение MID, HDMI, PCH

bash + проверить имя по регулярному выражению

Почему следующее регулярное выражение печатается valid , если имя hdpworker01 ?

 name=hdpworker01 [[ $name =~ worker[[:digit:]] ]] && echo valid 

Я пытаюсь сделать вывод valid только если имя соответствует worker[0-999] .

Пример ожидаемых результатов:

  • Для name=worker01 : valid
  • Для name=hdpworker01 : нет вывода

Регулярное выражение не привязано к началу или концу строки по умолчанию. Это отличается, например, от шаблонов смещения имени файла. Это означает, что выражение может совпадать в любом месте данной строки.

Чтобы привязать ваше выражение к началу строки, используйте

 ^worker[[:digit:]] 

Чтобы дополнительно привязать его к концу строки и разрешить от одной до трех цифр, используйте

 ^worker[[:digit:]]{1,3}$ 

Если вы хотите сопоставить worker10 но не worker01 или worker003 (без нулевых чисел), используйте

 ^worker([0-9]|[1-9][0-9]{1,2})$ 

Прикрепите регулярное выражение с обеих сторон.

 ^worker[[:digit:]]$ 

почему следующее регулярное выражение печатает правильно, в то время как имя hdpworker01

Зачем? Поскольку регулярное выражение не привязано , то есть оно не определяет начало (или конец) строки, которая должна соответствовать. worker регулярного выражения будет соответствовать, если какая-либо часть сопоставляемой строки является worker . Это будет соответствовать hdpworkeranything так же как worker и многим другим изменениям. Чтобы сопоставить строку, начинающуюся с worker укажите в регулярном выражении символ ^ , например:

 ^worker 

Если вы хотите сопоставить (до) 3 цифры после слова «рабочий», вы можете использовать:

 ^worker[0-9]{0,3}$ 

Тем не менее, будет целесообразно захватить число с круглыми скобками и поместить регулярное выражение в переменную (использование переменной является наилучшей практикой):

 re='^worker([0-9]{0,3})$' 

$ Означает, что строка должна заканчиваться в этой точке.
Матч станет:

 [[ $str =~ $re ]] && n=$((10#${BASH_REMATCH[1]}+0)) || n=-1 

то, что я пытаюсь сделать, это напечатать действительное, только если имя является работником [0-999]

И это позволит проверить диапазон числа n :

 (( 0 <= n && n <= 999 )) && echo "valid with n=$n"