Bash-如何将非字母数字字符转换为"_"

khe*_*aud 11 regex string bash

我试图将用户输入存储在变量中并清理该变量,以便仅保留字母数字caract +其他一些(我的意思是[a-zA-Z0-9-_]).

我尝试过使用它,但并非详尽无遗:

SERVICE_NAME=$(echo $SERVICE_NAME | tr A-Z a-z | tr ' ' _ | tr \' _ | tr \" _)
Run Code Online (Sandbox Code Playgroud)

你有帮助吗?

use*_*own 17

Bash的字符串替换是件好事:$ {var // pat/rep}

val='Foo$%!*@BAR###baZ'
echo ${val//[^a-zA-Z_-]/_}
Foo_____BAR___baZ
Run Code Online (Sandbox Code Playgroud)

一个小的解释:斜杠引入了一个搜索/替换,有点像sed(它只是划分模式).但是你使用一个斜杠替换一个:

val='Foo$%!*@BAR###baZ'
echo ${val/[^a-zA-Z_-]/_}
Foo_%!*@BAR###baZ
Run Code Online (Sandbox Code Playgroud)

两个斜杠//意味着全部替换.不常见,但它有一些逻辑,多个斜线表示多次替换(请原谅我可怜的英语).

并注意$是如何从变量中分离出来的,但很难以这种方式修改文字常量(这对于测试很有用).修改$ 1也不是一件容易的事,afaik.


Ste*_*ice 11

$ echo 'asd!@QCW@@D' | tr A-Z a-z | sed -e 's/[^a-zA-Z0-9\-]/_/g'
asd__qcw__d
Run Code Online (Sandbox Code Playgroud)

我会使用sed这个并^在你的有效字符集中使用(not)运算符,并用下划线替换其他所有内容.以上显示了输出的语法.

而且,作为奖励,如果你想用一个下划线替换一堆无效字符,只需添加+到正则表达式(并使用-r开关sed使其使用扩展正则表达式:

$ echo 'asd!@QCW@@D' | tr A-Z a-z | sed -r 's/[^a-zA-Z0-9\-]+/_/g'
asd_qcw_d
Run Code Online (Sandbox Code Playgroud)