【问题标题】:How can I ensure a Bash string is alphanumeric, without an underscore?如何确保 Bash 字符串是字母数字的,没有下划线?
【发布时间】:2010-11-16 18:49:39
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: regex bash sed grep


    【解决方案1】:

    似乎应该这样做:

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

    【讨论】:

    • 第二个表达式如何与 grep 一起使用?我正在寻找手册页中的开关,但没有成功:我正在回显一个应该匹配的字符串,但没有任何输出。
    • @Montecristo: grep -Eegrep
    • 我试过这个:echo 1asdas*_- | grep -E '^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$',没有输出(也没有单引号),大声笑我应该问我认为的问题...:P
    • @Montecristo:您的测试字符串包含星号和下划线并以连字符结尾,表达式不允许使用任何一种。
    • @Welbog:非常感谢,我完全错过了如何使用它的重点:P
    【解决方案2】:

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

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

    【讨论】:

    • 为什么^在这里代表否定而不是第一次出现?
    • 它的意思是“行首”,所以它和$之间的每个字符都必须符合模式。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-25
        • 2020-12-22
        • 1970-01-01
        • 2013-06-03
        • 1970-01-01
        • 1970-01-01
        • 2014-10-19
        • 1970-01-01
        相关资源
        最近更新 更多