从字符串变量中删除数字(去除数字字符)

从字符串变量中删除数字(去除数字字符)

我想从字符串变量中删除所有数字字符,例如:

VARIABLE=qwe123rty567

到:

echo $VARIABLE
> qwerty

我找了很多帖子但他们要么使用 sed 输出到文件/文件名,要么输出到 echo。由于空白,我无法使用它:

VARIABLE=$VARIABLE | sed 's/[0-9]*//g'

答案1

bash

$ printf '%s\n' "${VARIABLE//[[:digit:]]/}"
qwerty

[:digit:]可以包含 0 到 9 以外的其他字符,具体取决于您的区域设置。如果您只想删除 0 到 9,请改用C区域设置。

答案2

为了多样化,这里有使用的方法

tr:

VARIABLE=$(printf '%s' "$VARIABLE" | tr -d '0123456789')

sed:

VARIABLE=$(printf '%s' "$VARIABLE" | sed 's/[0-9]//g')

Bash 扩展,迄今为止最简洁的:

VARIABLE=${VARIABLE//[0-9]/}

最后再次扩展 Bash,这次使用[[:digit:]]字符类。

VARIABLE=${VARIABLE//[[:digit:]]/} 

请注意(正如其他人指出的那样)[[:digit:]]应该涵盖您所在区域中定义为数字的任何内容。

答案3

VARIABLE=qwe123rty567
IFS=0123456789
set -f # Disable glob
printf %s $VARIABLE

qwerty

进一步的操纵是可能的。

VARIABLE=qwe123rty567
IFS=0123456789
set -f # Disable glob
set -- $VARIABLE
IFS=;   VARIABLE=$*
printf "replaced $# numbers in \$VARIABLE. RESULT:\t%s\n" "$*"

replaced 6 numbers in $VARIABLE. RESULT:    qwerty

答案4

空格(实际上,未能引用变量)只是问题的一部分。

你不能像sed这样通过管道传递一个变量,这是行不通的。更准确地说,它不会通过管道传输“$VARIABLE”的值sed,shell 将尝试执行“$VARIABLE”的值并通过管道传输其输出sed。顺便说一句,这不是一个错误 - 如果 $VARIABLE 碰巧包含有效命令(例如lsrsync或其他),这很有用。

另外,如果要将命令或管道的输出分配给变量,则需要用 . 将该命令/管道括起来$()

因此,要使用 修改变量sed,您需要执行以下操作:

VARIABLE=$(printf '%s' "$VARIABLE" | sed 's/[0-9]*//g')

您可以使用echoThere 而不是,printf但 echo 会解释并作用于 $VARIABLE 中的某些字符序列(例如\t\n\r等),而printf不会。您将遇到很多使用echo... 的示例,将它们替换为printf '%s',这样更安全。

相关内容