我想从字符串变量中删除所有数字字符,例如:
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 碰巧包含有效命令(例如ls
或rsync
或其他),这很有用。
另外,如果要将命令或管道的输出分配给变量,则需要用 . 将该命令/管道括起来$()
。
因此,要使用 修改变量sed
,您需要执行以下操作:
VARIABLE=$(printf '%s' "$VARIABLE" | sed 's/[0-9]*//g')
您可以使用echo
There 而不是,printf
但 echo 会解释并作用于 $VARIABLE 中的某些字符序列(例如\t
、\n
、\r
等),而printf
不会。您将遇到很多使用echo
... 的示例,将它们替换为printf '%s'
,这样更安全。