Intereting Posts
Как я могу загрузить RedHat с внешнего жесткого диска на компьютере macbook? Сеть отключается, когда подключен кабель LAN NixOS на MacBook: как включить датчик внезапного движения? Как проверить возможные конфликты при использовании псевдонимов в bashrc? Настроить верхнюю панель / глобальное меню / Super-Wingpanel в элементарной операционной системе Luna файл globbing в bash не подбирается php -l Что означает индикатор noeol внизу сеанса редактирования vim? Как я могу исключить файлы по умолчанию с помощью rsync? Как создать моментальный снимок только для чтения в LVM, а затем откат к нему после некоторой работы? Как удалить ubuntu в системе двойной загрузки? Как отлаживать модуль ядра, в котором отображается указатель NULL? Сбрасывание видео с помощью avconv / ffmpeg Дублирование файловых дескрипторов при перенаправлении Несколько указателей мыши неустойчивы Как распечатать следующую неделю с помощью команды date?

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"