Regex Unix-如何替换无效字符?

Regex Unix-如何替换无效字符?,regex,bash,shell,Regex,Bash,Shell,我正在编写一个unixsbashshell脚本 我想用下划线(“\”)替换文本中的所有无效字符。 我的有效字符列表是a-z、a-z、“uu”和0-9。基本上它是字母数字和u。 在下面的例子中 #!/bin/bash hostname=soa.ax-123 我希望将变量hostname值替换为soa\u ax\u 123 有人能帮我写一个登录名来查找无效字符并将其替换为“\ux”吗 提前谢谢 chris您可以在参数展开中进行模式替换: #!/bin/bash hostname=soa.ax-12

我正在编写一个unixsbashshell脚本

我想用下划线(“\”)替换文本中的所有无效字符。 我的有效字符列表是a-z、a-z、“uu”和0-9。基本上它是字母数字和u。 在下面的例子中

#!/bin/bash
hostname=soa.ax-123
我希望将变量hostname值替换为soa\u ax\u 123

有人能帮我写一个登录名来查找无效字符并将其替换为“\ux”吗

提前谢谢
chris

您可以在参数展开中进行模式替换:

#!/bin/bash
hostname=soa.ax-123
newhostname=${hostname//[^a-zA-Z_0-9]/_}
echo "The fixed hostname is $newhostname"
您可以使用以下选项:

echo $hostname | sed 's/\W/_/g'

sed
是你的朋友。对“tr”来说似乎是个完美的工作。tr是你的朋友
tr-c'[:alnum:]'.
。更多示例还可以使用预定义的
word
字符类:
newhostname=${hostname/[^[:word:]/}
@chepner在这种情况下,您必须先将区域设置为c
hostname=$(echo soa.ax-123 | sed s/[^a-zA-Z0-9_]/_/g)