从字符串末尾删除数字

3
我希望从字符串的末尾删除数字。 例如:
 string123
 example545

输出:

string
example

以下任何一个回答了你的问题吗? - z atef
是的,我已经勾选了那个选项:),抱歉我离开了一会儿。 - jake reading
不知道为什么这个被踩了。这里有些人肯定是装腔作势的。 - Ken - Enough about Monica
@HH 可能是因为它看起来很像一道作业题,没有显然的努力去找答案(或者至少没有展示出来)。他们对此会感到不满意。当然现在我也在尝试类似的事情,我的搜索将我带到了这里。 - Doktor J
5个回答

13

不需要外部工具,只需使用参数扩展和扩展的globbing:

$ shopt -s extglob
$ var=string123
$ echo "${var%%+([[:digit:]])}"
string
$ var=example545
$ echo "${var%%+([[:digit:]])}"
example
< p > +(pattern) 扩展的 glob 模式是 "一个或多个此类",因此 +([[:digit:]]) 表示 "一个或多个数字"。

${var%%pattern} 扩展意味着 "从 var 的末尾删除最长可能匹配的 pattern。"


1
你如何再次禁用 extglob? - Hubert Grzeskowiak
2
@Hubert shopt -u extglob - Benjamin W.

6

假设字符串中没有其他数字,您可以这样操作:

echo string123 | sed 's/[0-9]//g'
string

仅限于字符串的尾部:

echo S1tring123 | sed 's/[0-9]\+$//'
S1tring

$ 表示行末。


如果字符串包含 "S1tring123",我希望仅删除末尾的数字,因此删除直到字母类型为止。 - jake reading
2
这在第一个位置上非常重要,因为这样只会去掉第一个数字 :) - PesaThe

2
awk '{sub(/[0-9]+$/,"")}1' file

string
example

2
使用 grep 命令
echo S1tring123 | grep -o '.*[^0-9]'

1

我不确定是否完全理解您的要求,但尝试如下:

sed 's/[0-9]*\([^[:alnum:]]*\)$/\1/' file

或者可能是:

或许:

sed 's/[0-9]*\([^0-9]*\)$/\1/' file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接