【问题标题】:Replace all non-alphanumeric characters in a string with an underscore用下划线替换字符串中的所有非字母数字字符
【发布时间】:2018-11-25 08:45:12
【问题描述】:

我想用 _(下划线)替换特殊字符(正则表达式 \W) 但我不想用下划线替换空格 也用单个下划线替换多个连续的特殊字符

示例 字符串:The/Sun is red@ 输出:The_Sun is red_

字符串:.//hack Moon 输出:_hack Moon

我试过echo 'string' | sed 's/\W/_/g' 但这并不准确

【问题讨论】:

  • 应该注意\W 将匹配除单词字符之外的任何字符。单词字符是任何字母字符、数字或_,有关详细信息,请参阅here
  • @potong 谢谢你的信息,我只是想避免文件名中出现任何非法字符

标签: regex bash awk sed


【解决方案1】:

sed 方法:

s="The/Sun is red@ .//hack Moon"

sed -E 's/[^[:alnum:][:space:]]+/_/g' <<<"$s"
The_Sun is red_ _hack Moon

  • [^[:alnum:][:space:]]+ - 匹配除字母数字和空格以外的任何字符序列

【讨论】:

    【解决方案2】:

    为此使用tr

    echo "The/Sun is red@" | tr -s -c [:alnum:][:blank:] _
    

    [:alnum:][:blank:] 表示字母数字字符和空格,-c 表示相反。

    添加:-s 将重复的下划线压缩为一个。

    【讨论】:

    • 请注意,OP 还要求单个下划线替换多个连续的特殊字符。
    • @simlev 感谢您的评论。我忽略了这一点。 tr -s 将用替换字符的单个实例替换多个重复的搜索字符
    【解决方案3】:

    仅使用 bash 参数扩展,与其他答案的模式类似:

    shopt -s extglob
    for str in "The/Sun is red@" ".//hack Moon"; do 
        echo "${str//+([^[:alnum:][:blank:]])/_}"
        # .........^^........................^  replace all
        # ...........^^.....................^    one or more
        # .............^^^^^^^^^^^^^^^^^^^^^      non-alnum, non-space character
    done
    
    The_Sun is red_
    _hack Moon
    

    【讨论】:

      猜你喜欢
      • 2012-10-10
      • 2010-12-20
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      相关资源
      最近更新 更多