在bash脚本中,如何清除用户输入?
时间:2020-03-06 14:19:49 来源:igfitidea点击:
我正在寻找最好的方法来进行简单的输入:
echo -n "Enter a string here: " read -e STRING
并通过删除非字母数字字符,小写(大写)并用下划线替换空格来清理它。
顺序重要吗? tr是解决此问题的最佳/唯一方法吗?
解决方案
经过一番环顾后,看来tr
确实是最简单的方法:
export CLEANSTRING="`echo -n "${STRING}" | tr -cd '[:alnum:] [:space:]' | tr '[:space:]' '-' | tr '[:upper:]' '[:lower:]'`"
我想是奥卡姆的剃刀。
快速而肮脏:
STRING =
echo'dit / ZOU / een test123'| perl -pe's / // g; tr / [A-Z] / [a-z] /; s / [^ a-zA-Z0-9] // g'''
我们可以通过perl运行它。
export CLEANSTRING=$(perl -e 'print join( q//, map { s/\s+/_/g; lc } split /[^\s\w]+/, $ENV{STRING} )')
我在这里使用的是ksh样式的subshell,我不太确定它是否可以在bash中工作。
关于shell的好处是,我们可以使用perl,awk,sed,grep...。
Bash可以自己完成所有操作,非常感谢。如果查看参数扩展手册页中的部分,我们会看到bash具有内置的替换,子字符串,修剪,rtrim等。
要消除所有非字母数字字符,请执行
CLEANSTRING=${STRING//[^a-zA-Z0-9]/}
那是奥卡姆的剃刀。无需启动另一个进程。
正如dj_segfault指出的那样,shell可以为我们完成大部分操作。看起来,我们将不得不依靠外部的东西来降低字符串的大小写。为此,我们有很多选择,例如上面的perl单行代码等,但是我认为tr可能是最简单的。
# first, strip underscores CLEAN=${STRING//_/} # next, replace spaces with underscores CLEAN=${CLEAN// /_} # now, clean out anything that's not alphanumeric or an underscore CLEAN=${CLEAN//[^a-zA-Z0-9_]/} # finally, lowercase with TR CLEAN=`echo -n $CLEAN | tr A-Z a-z`
这里的顺序有些重要。我们要去除下划线,并用下划线替换空格,因此我们必须确保先去除下划线。通过等待将内容传递给tr直到结尾,我们知道我们只有字母数字和下划线,并且可以确保没有空格,因此我们不必担心shell会解释特殊字符。