用下划线替换字符串中的所有非字母数字字符

时间:2018-06-15 13:33:36

标签: regex bash awk sed

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

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

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

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

3 个答案:

答案 0 :(得分:4)

sed 方法:

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

sed -E 's/[^[:alnum:][:space:]]+/_/g' <<<"$s"
The_Sun is red_ _hack Moon
  • [^[:alnum:][:space:]]+ - 匹配除字母数字和空格之外的任何字符序列

答案 1 :(得分:4)

使用tr

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

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

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

答案 2 :(得分: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