Почему мой RegEx всегда возвращает true в Bash? - PullRequest
1 голос
/ 08 ноября 2019

Как часть bash-скрипта, я пытаюсь создать фильтр, который выходит из скрипта при передаче неверного имени файла:

if [[ ! $1 =~ [^DCS-932L20\d{14}(\.[jJ][pP][gG])$] ]]; then 
   echo "'$1' is not a valid name"
   exit 1
fi

При тестировании RegEx в отладчике он соответствует правильной строке,например: DCS-932L2019110607132405.jpg

Но при реализации в bash-скрипте оператор IF всегда возвращает true

Когда я сокращаю RegEx до [^DCS-], все кажется работающим, нодобавление только '9' ([^DCS-9]) достаточно, чтобы оператор снова возвращал true

Я пытался убежать ([^DCS\-9] или [^DCS-\9])

Iпопробовал цитаты (["^DCS-9"] или ['^DCS-\9'])

И я попробовал их комбинации.

Я довольно новичок и в bash, и в RegEx, так что если кто-то может объяснить, что не такЯ буду благодарен

1 Ответ

3 голосов
/ 08 ноября 2019

Вы создали выражение в скобках из своего регулярного выражения, заключив его в квадратные скобки. Кроме того, регулярное выражение Bash POSIX ERE не поддерживает \d сокращенный класс символов, вам необходимо использовать либо [0-9], либо [[:digit:]].

. Лучше объявить регулярное выражение до и использовать как переменную без кавычек после=~:

rx='^DCS-932L20[0-9]{14}\.[jJ][pP][gG]$'
if [[ ! "$1" =~ $rx ]]; then

См. онлайн-демо Bash .

Обратите внимание, что здесь вам не нужны скобки для группировки, поэтому они удалены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...