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