我正在寻找进行简单输入的最佳方法:
1 2
| echo -n"Enter a string here:"
read -e STRING |
并通过删除非字母数字字符,小写(大写)并用下划线替换空格来清理它。
顺序重要吗? tr是解决此问题的最佳/唯一方法吗?
正如dj_segfault指出的那样,shell可以为您完成大部分操作。看起来,您将不得不依靠外部的东西来降低字符串的大小写。为此,您有很多选择,例如上面的perl单行代码等,但是我认为tr可能是最简单的。
1 2 3 4 5 6 7 8
| # 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会解释特殊字符。
Bash可以自己完成所有操作,非常感谢。如果查看参数扩展手册页中的部分,您会看到bash具有内置的替换,子字符串,修剪,rtrim等。
要消除所有非字母数字字符,请执行
1
| CLEANSTRING=${STRING//[^a-zA-Z0-9]/} |
那是奥卡姆的剃刀。无需启动另一个进程。
您可以通过perl运行它。
1
| 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...。
快速又肮脏:
STRING=`echo 'dit /ZOU/ een test123' | perl -pe's/ //g;tr/[A-Z]/[a-z]/;s/[^a-zA-Z0-9]//g'`
经过一番环顾,看来tr确实是最简单的方法:
1
| export CLEANSTRING="`echo -n"${STRING}" | tr -cd '[:alnum:] [:space:]' | tr '[:space:]' '-' | tr '[:upper:]' '[:lower:]'`" |
我想是奥卡姆的剃刀。