在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样式的subshel​​l,我不太确定它是否可以在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会解释特殊字符。