我正在寻找接受简单输入的最佳方法:

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

并通过删除非字母数字字符、小写字符以及用下划线替换空格来清理它。

顺序重要吗?是 tr 最好/唯一的方法来解决这个问题?

有帮助吗?

解决方案

正如 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 解释特殊字符。

其他提示

Bash 可以自己完成这一切,非常感谢。如果您查看手册页的部分 参数扩展, ,你会看到 bash 有内置的替换、子字符串、trim、rtrim 等。

要消除所有非字母数字字符,请执行以下操作

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

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

又快又脏:

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 风格的子 shell,我不完全确定它在 bash 中是否有效。

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

环顾四周后似乎 tr 确实是最简单的方法:

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

奥卡姆剃刀, , 我想。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top