47

我正在寻找获取简单输入的最佳方法:

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

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

顺序重要吗?是tr最好/唯一的方法吗?

4

6 回答 6

50

正如 dj_segfault 指出的那样,shell 可以为您完成大部分工作。不过,看起来你必须依靠外部的东西来小写字符串。为此,您有很多选择,例如上面的 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 A-Z a-z`

这里的顺序有些重要。我们想去掉下划线,加上用下划线替换空格,所以我们必须确保先去掉下划线。通过等待将东西传递给 tr 直到最后,我们知道我们只有字母数字和下划线,并且我们可以确定我们没有空格,所以我们不必担心 shell 解释特殊字符。

于 2008-09-18T17:04:57.623 回答
39

Bash 可以自己完成这一切,非常感谢。如果您查看手册页的Parameter Expansion部分,您会看到 bash 具有内置替换、子字符串、修剪、rtrim 等。

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

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

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

于 2008-09-18T04:18:28.277 回答
3

对于Bash >= 4.0

CLEAN="${STRING//_/}" && \
CLEAN="${CLEAN// /_}" && \
CLEAN="${CLEAN//[^a-zA-Z0-9]/}" && \
CLEAN="${CLEAN,,}"

这对于使用 docker/podman 以编程方式创建容器名称特别有用。但是,在这种情况下,您还需要删除下划线:

# Sanitize $STRING for a container name
CLEAN="${STRING//[^a-zA-Z0-9]/}" && \
CLEAN="${CLEAN,,}"
于 2020-01-26T14:43:28.480 回答
1

又快又脏:

STRING=`echo 'dit /ZOU/ een test123' | perl -pe's/ //g;tr/[A-Z]/[a-z]/;s/[^a-zA-Z0-9]//g'`

于 2008-09-18T03:06:00.197 回答
1

你可以通过 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....

于 2008-09-18T03:36:45.083 回答
0

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

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

我猜是奥卡姆剃刀

于 2008-09-18T03:01:50.333 回答