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

Raa*_*Dev 7 regex bash grep sed

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

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

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

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

Wel*_*bog 16

似乎应该这样做:

^[a-zA-Z0-9][-a-zA-Z0-9]{0,61}[a-zA-Z0-9]$
Run Code Online (Sandbox Code Playgroud)

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

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

^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$
Run Code Online (Sandbox Code Playgroud)

用法示例:


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:]]$'
Run Code Online (Sandbox Code Playgroud)