Shell unix命令提取最后一个字母字符串后的数字

Shell unix命令提取最后一个字母字符串后的数字,shell,Shell,字符串:“gamma021AH00999NAK41” 最后两位数字可能不同。它可能是3位4位,等等。。。 给定字符串中的“NAK”可以是任何其他字符串,但它只包含字符。 所以我的目的是提取最后一个数字(给定字符串中的示例41),直到第一个字符 提前感谢您可以将所有字母字符替换为例如“#”,然后使用基于“#”分隔符的最后一个字段: echo "gamma021AH00999NAK41" | sed "s/[aA-zZ]/#/g" | awk -F'#' '{print $NF}' 注意:如果字符

字符串:“gamma021AH00999NAK41” 最后两位数字可能不同。它可能是3位4位,等等。。。 给定字符串中的“NAK”可以是任何其他字符串,但它只包含字符。 所以我的目的是提取最后一个数字(给定字符串中的示例41),直到第一个字符


提前感谢

您可以将所有字母字符替换为例如“#”,然后使用基于“#”分隔符的最后一个字段:

echo "gamma021AH00999NAK41" | sed "s/[aA-zZ]/#/g" | awk -F'#' '{print $NF}'
注意:如果字符串中有字母数字以外的符号,则此操作无效

编辑:仅不带
awk
(谢谢@CharlesDuffy):

仅使用shell内置命令(不使用外部命令,如
sed
awk
,因此,如果您要反复重复此操作,每行执行一次,则速度会快得多):


${var##pattern}
是一种在返回值之前从
var
的值的前面删除
pattern
的最长匹配项的方法
*[:alpha:]
作为一个通配符,后跟一个alpha字符,因此将删除字符串中
K
之前的所有内容。

我看不到关于长度变化的内容,因此此命令将起作用:

echo "gamma021AH00999NAK41" | cut -b '19-'

回答:41

在第一个字符之前,您是什么意思?最后一个数字后面还有其他字符吗?对不起,我的意思是,请按相反的顺序忽略此问题,而不是请求忽略此问题,您可以根据需要删除它,只需单击“删除”…尽管回答后,如果问题及其答案可能对其他人有帮助,那么删除它不再是一种好形式;堆栈溢出存在的全部原因是为了建立一个知识库;你可以用同样的效果运行
awk-F'[:alpha:]''{print$NF}'
。@charlesduff谢谢,我确信这样做是可能的,但没有找到。(
[aA zZ]
对我来说是一个新概念;它很聪明,因为它可以正确地处理排序类似于
aAbB…zZ
的区域设置和类似于
abc…zABC…Z
的区域设置,但可能最好只使用命名字符类,而不需要这种聪明;我不知道
aAbB…zZ
区域设置是否存在,但如果存在,它就不会存在uld在那里分解)。
s=gamma021AH00999NAK41
result=${s##*[[:alpha:]]}
echo "$result"
echo "gamma021AH00999NAK41" | cut -b '19-'