【问题标题】:replace more than one special character with sed用 sed 替换多个特殊字符
【发布时间】:2015-01-29 22:17:03
【问题描述】:

我是正则表达式的菜鸟,所以我对 sed 感到头疼。 我需要帮助将给定公司名称中的所有特殊字符替换为“-”。

所以这是给定的字符串:

FML Finanzierungs- und Mobilien Leasing GmbH & Co. KG

我想要结果:

FML-Finanzierungs-und-Mobilien-Leasing-GmbH-&-Co-KG

我尝试了以下方法:

nr = $(echo "$name" | sed -e 's/ /-/g'))

所以这会将所有空格替换为-,但是替换其他空格的正确表达式是什么?我通过谷歌搜索不是很成功。

【问题讨论】:

  • 除了空格,你还想替换什么其他字符? .?
  • 还要注意nr = $(...) 是错误的。您需要删除 = 周围的空格。

标签: regex bash sed


【解决方案1】:

这取决于你认为什么是特殊字符——我这么说是因为你似乎认为& 是一个普通字符而不是.,这似乎有点奇怪。无论如何,我想像某种形式的东西

nr=$(echo "$name" | sed 's/[^[:alnum:]&]\+/-/g')

会为您提供最好的服务。这里[^[:alnum:]&] 匹配任何不是字母数字或& 的字符,而[^[:alnum:]&]\+ 匹配一个或多个此类字符的序列,因此sed 调用将$name 中的所有此类序列替换为连字符。如果还有其他您认为是常规的字符,请将它们添加到集合中。请注意,元音变音等的处理取决于您的语言环境。

另请注意,如果$name 以连字符开头(它可以被解析为echo 的选项),echo 可能会造成麻烦,所以如果你可以将自己束缚到bash ,

nr=$(sed 's/[^[:alnum:]&]\+/-/g' <<< "$name")

可能更健壮。

【讨论】:

    【解决方案2】:

    显然你想删除-.,然后用- 替换空格。

    这样就可以了,说sed -e 'one thing' -e 'another thing':

    $ echo "$name" | sed -e 's/[-\.]//g' -e 's/ /-/g'
    FML-Finanzierungs-und-Mobilien-Leasing-GmbH-&-Co-KG
    

    请注意,我们将要平等对待的所有字符都括在方格内:[-\.] 表示 -.(我们需要对其进行转义,否则它将匹配任何字符)。

    【讨论】:

      【解决方案3】:

      这样做可以帮助你:

      awk -vOFS=- '{gsub(/[.-]/,"");$1=$1}1' <<< "$name"
      FML-Finanzierungs-und-Mobilien-Leasing-GmbH-&-Co-KG
      

      gsub(/[.-]/,"") 删除 ._
      -vOFS=- 将新的字段分隔符设置为 -
      $1=$1 重构该行,使其使用新的字段分隔符
      1 打印行。

      把它放到一个变量中

      nr=$(awk -vOFS=- '{gsub(/[.-]/,"");$1=$1}1' <<< "$name")
      

      【讨论】:

        【解决方案4】:

        也试试这个方法

        echo "name" | sed 's/ \|- \|\. /-/g'
        

        输出:

        FML-Finanzierungs-und-Mobilien-Leasing-GmbH-&-Co-KG
        

        【讨论】:

          猜你喜欢
          • 2019-09-07
          • 2021-06-11
          • 1970-01-01
          • 2019-05-14
          • 1970-01-01
          • 1970-01-01
          • 2021-11-17
          相关资源
          最近更新 更多