我正在尝试将用户输入存储在变量中并清理该变量,以便仅保留字母数字caract +其他一些(我的意思是[a-zA-Z0-9 -_])。
我尝试过使用它,但并非详尽无遗:
SERVICE_NAME=$(echo $SERVICE_NAME | tr A-Z a-z | tr ' ' _ | tr \' _ | tr \" _)
你对此有所帮助吗?
答案 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