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

Sol*_*ris 4 regex bash awk sed

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

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

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

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

Rom*_*est 7

sed 方法:

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

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


hek*_*mgl 6

用途tr为:

echo "The/Sun is red@" | tr -s -c [:alnum:][:blank:] _
Run Code Online (Sandbox Code Playgroud)

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

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