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

时间:2011-06-15 16:52:32

标签: regex bash string

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

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

SERVICE_NAME=$(echo $SERVICE_NAME | tr A-Z a-z | tr ' ' _ | tr \' _ | tr \" _)

你对此有所帮助吗?

4 个答案:

答案 0 :(得分:16)

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

val='Foo$%!*@BAR###baZ'
echo ${val//[^a-zA-Z_-]/_}
Foo_____BAR___baZ

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

val='Foo$%!*@BAR###baZ'
echo ${val/[^a-zA-Z_-]/_}
Foo_%!*@BAR###baZ

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

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

答案 1 :(得分:11)

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

我会使用sed进行此操作,并在您的有效字符集中使用^(非)运算符,并使用下划线替换其他所有内容。上面显示了输出的语法。

并且,作为奖励,如果您想用一个下划线替换一系列无效字符,只需将+添加到正则表达式(并使用-r切换到sed使它使用扩展的正则表达式:

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

答案 2 :(得分:1)

我相信一切都可以在这样的单个sed命令中完成:

echo 'Foo$%!*@BAR###baZ' | sed -e 's/[A-Z]/\L&/g' -e 's/[^a-z0-9\-]/_/g'

输出

foo_____bar___baz

答案 3 :(得分:0)

perl方式:

perl -ple 's/[^\w\-]/_/g'

纯粹的bash方式

a='foo-BAR_123,.:goo'
echo ${a//[^[:alnum:]-]/_}

产生

foo-BAR_123___goo