Как я могу убедиться, что строка Bash является буквенно-цифровой, без подчеркивания? - PullRequest
7 голосов
/ 04 августа 2009

Я добавляю в существующий скрипт функцию, которая позволит пользователю настраивать имя хоста системы Linux. Правила, которые я применяю, таковы:

  • Должно быть длиной от 2 до 63 символов
  • Не должно начинаться или заканчиваться дефисом
  • Может содержать только буквенно-цифровые символы и дефисы; все другие символы недопустимы (включая подчеркивание, что означает, что я не могу использовать символ регулярного выражения \ W)

Я решил первые два в списке, но мне сложно понять, как проверить, содержит ли строка bash только буквы, цифры и дефисы. Я думаю, что могу сделать это с помощью регулярных выражений, но мне сложно понять, как (я провел последний час, просматривая веб-страницы и читая страницы руководства).

Я открыт для использования sed, grep или любых других стандартных инструментов, но не для Perl или Python.

Ответы [ 4 ]

16 голосов
/ 04 августа 2009

Похоже, это должно быть сделано:

^[a-zA-Z0-9][-a-zA-Z0-9]{0,61}[a-zA-Z0-9]$

Соответствует любому буквенно-цифровому символу, затем соответствует до 61 буквенно-цифровому символу (включая дефисы), а затем соответствует любому одному буквенно-цифровому символу Минимальная длина строки - 2, максимальная - 63. Это не работает с Unicode. Если вам нужно, чтобы он работал с Unicode, вам нужно добавить различные классы символов вместо a-zA-Z0-9, но принцип будет таким же.

Я считаю, что правильное выражение grep, которое будет работать с Unicode:

^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$

Пример использования:


echo 123-abc-098-xyz | grep -E '^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$'

result=$(grep -E '^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$' <<< "this-will-work"); echo $result;

echo "***_this_will_not_match_***" | grep -E '^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$'
2 голосов
/ 04 августа 2009

Это bash-скрипт, тестирующий первый параметр, содержит ли он только буквенно-цифровые или дефисы. Он «передает» содержимое $ 1 в grep:

#!/bin/bash
if grep '^[-0-9a-zA-Z]*$' <<<$1 ;
  then echo ok;
  else echo ko;
fi
1 голос
/ 05 августа 2009

вы можете сделать это просто bash

string="-sdfsf"
length=${#string}
if [ $length -lt 2 -o $length -gt 63 ] ;then
    echo "length invalid"
    exit
fi
case $string in
    -* ) echo "not ok : start with hyphen";exit ;;    
    *- ) echo "not ok : end with hyphen";exit ;;   
    *[^a-zA-Z0-9-]* ) echo "not ok : special character";exit;; 
esac
1 голос
/ 04 августа 2009

Это для последнего вам нужно: sed -e 's/[^[:alnum:]|-]//g'

...