我想用_(下划线)替换特殊字符(正则表达式\ W) 但我不想用下划线替换空格 同时用单个下划线替换多个连续的特殊字符
实施例
字符串:The/Sun is red@
输出:The_Sun is red_
字符串:.//hack Moon
输出:_hack Moon
我试过echo 'string' | sed 's/\W/_/g'
但这不准确
答案 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