在bash脚本中,我如何清理用户input?

我正在寻找采取简单input的最佳方式:

echo -n "Enter a string here: " read -e STRING 

并通过删除非字母数字字符,降低(大小写)和用下划线replace空格来清理它。

订单是否重要? 是最好的/唯一的方式去做这件事?

正如dj_segfault指出的那样,shell可以为你做大部分的工作。 不过,看起来你不得不退缩到一些外部的东西,以便降低string。 对于这个,你有很多select,比如上面的perl one-liners等,但是我认为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 AZ az` 

这里的顺序有点重要。 我们希望摆脱下划线,加上用下划线replace空格,所以我们必须首先去掉下划线。 通过等待传递到最后,我们知道我们只有字母数字和下划线,而且我们可以肯定我们没有空格,所以我们不必担心shell解释的特殊字符。

Bash可以自己做这一切,非常感谢。 如果您查看参数扩展手册页的部分,您会看到该bash包含内置replace,子string,修剪,rtrim等。

要消除所有非字母数字字符,请执行

 CLEANSTRING=${STRING//[^a-zA-Z0-9]/} 

那是奥卡姆的剃刀。 不需要启动另一个进程。

快速和肮脏:

STRING=`echo 'dit /ZOU/ een test123' | perl -pe's/ / /g;tr/[AZ]/[az]/;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-style子shell,我不完全确定它在bash中的作用。

这是shell的好处,是你可以使用perl,awk,sed,grep ….

经过一番环顾,似乎tr确实是最简单的方法:

 export CLEANSTRING="`echo -n "${STRING}" | tr -cd '[:alnum:] [:space:]' | tr '[:space:]' '-' | tr '[:upper:]' '[:lower:]'`" 

奥卡姆的剃刀 ,我想。