【问题标题】:Bash- How to convert non-alphanumerical character to "_"Bash-如何将非字母数字字符转换为“_”
【发布时间】:2011-09-15 17:20:27
【问题描述】:

我正在尝试将用户输入存储在一个变量中并清理该变量,以便只保留字母数字字符 + 其他一些字符(我的意思是 [a-zA-Z0-9-_])。

我尝试过使用它,但它并不详尽:

SERVICE_NAME=$(echo $SERVICE_NAME | tr A-Z a-z | tr ' ' _ | tr \' _ | tr \" _)

您对此有什么帮助吗?

【问题讨论】:

    标签: regex bash string


    【解决方案1】:
    $ echo 'asd!@QCW@@D' | tr A-Z a-z | sed -e 's/[^a-zA-Z0-9\-]/_/g'
    asd__qcw__d
    

    我会为此使用sed,并在您的一组有效字符中使用^(非)运算符,并用下划线替换其他所有内容。上面显示了输出的语法。

    另外,如果您想用一个下划线替换一系列无效字符,只需将+ 添加到您的正则表达式(并使用-r 切换到sed 使其使用扩展正则表达式:

    $ echo 'asd!@QCW@@D' | tr A-Z a-z | sed -r 's/[^a-zA-Z0-9\-]+/_/g'
    asd_qcw_d
    

    【讨论】:

    • 如果跨平台兼容性是个问题,请记住 BSD 的 sed 使用 -E 来启用扩展正则表达式。
    【解决方案2】:

    我相信这一切都可以在 1 个 sed 命令中完成,如下所示:

    echo 'Foo$%!*@BAR###baZ' | sed -e 's/[A-Z]/\L&/g' -e 's/[^a-z0-9\-]/_/g'
    

    输出

    foo_____bar___baz
    

    【讨论】:

      【解决方案3】:

      Bash 的字符串替换是个好东西:${var//pat/rep}

      val='Foo$%!*@BAR###baZ'
      echo ${val//[^a-zA-Z_-]/_}
      Foo_____BAR___baZ
      

      一个小解释:斜杠引入了搜索/替换,有点像 sed 中的(它只是分隔模式)。但是你用一个斜杠代替一个:

      val='Foo$%!*@BAR###baZ'
      echo ${val/[^a-zA-Z_-]/_}
      Foo_%!*@BAR###baZ
      

      两个斜线 // 表示全部替换。不常见,但它有一些逻辑,多个斜线表示多个替换(请原谅我的英语不好)。

      请注意 $ 是如何与变量分开的,但很难以这种方式修改文字常量(这对于测试来说会很好)。修改 $1 也不是一件容易的事,afaik。

      【讨论】:

        【解决方案4】:

        perl方式:

        perl -ple 's/[^\w\-]/_/g'
        

        纯 bash 方式

        a='foo-BAR_123,.:goo'
        echo ${a//[^[:alnum:]-]/_}
        

        产生:

        foo-BAR_123___goo
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-02-07
          • 2010-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-01
          相关资源
          最近更新 更多