如何确保Bash字符串是字母数字,没有下划线?

时间:2009-08-04 18:44:06

标签: regex bash sed grep

我正在为现有脚本添加一项功能,允许用户配置Linux系统的主机名。我正在执行的规则如下:

  • 长度必须介于2到63个字符之间
  • 不得以连字符开头或结尾
  • 只能包含字母数字字符和连字符;不允许所有其他字符(包括下划线,这意味着我不能使用\ W正则表达式符号)

我已经解决了列表中的前两个问题,但是我无法弄清楚如何检查bash字符串是否只包含字母,数字和连字符。我想我可以使用正则表达式做到这一点,但我无法弄清楚如何(我过去一小时在网上搜索并阅读手册页)。

我愿意使用sed,grep或任何其他标准工具,但不能使用Perl或Python。

4 个答案:

答案 0 :(得分:16)

似乎应该这样做:

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

匹配任何一个字母数字字符,然后匹配最多61个字母数字字符(包括连字符),然后匹配任何一个字母数字字符。最小字符串长度为2,最大值为63.它不适用于Unicode。如果你需要它来使用Unicode,你需要添加不同的字符类来代替a-zA-Z0-9,但原则是相同的。

我相信适用于Unicode的正确grep表达式是:

^[[: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:]]$'

答案 1 :(得分:2)

这是一个测试第一个参数的bash脚本,它是否只包含字母数字或连字符。它将$ 1的内容“管道”为grep:

#!/bin/bash
if grep '^[-0-9a-zA-Z]*$' <<<$1 ;
  then echo ok;
  else echo ko;
fi

答案 2 :(得分:1)

这是您需要的最后一个:sed -e 's/[^[:alnum:]|-]//g'

答案 3 :(得分:0)

你可以用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