TEXT='Random text 1 and some more random'
TEXT1='Random 19 and more'
TEXT='Anything 7 text text text'
我想获得数字之前的所有内容以及包含的数字。
现在,我可以获得不带数字的文本,如下所示:
echo "${TEXT// [0-9]*/}"
我的问题是:有没有办法通过内置的纯 Bash 来获得我想要的东西,就像我正在使用的那样?
答案1
尝试这个:
echo "'${TEXT// [^0-9]*/}'" "'${TEXT1// [^0-9]*/}'"
输出:
'Anything 7' 'Random 19'
请注意,如果字符串有不数字,此代码将删除第一个空格之后的所有内容。
答案2
如果只有一组数字,您可以分两步完成(在一次扩展中):
删除以数字结尾的最长的前导文本。
$ text='Random 923 and more' $ echo "'${text##*[0-9]}'" ' and more'
然后,从原始字符串中删除所选的尾随文本:
$ echo "'${text%"${text##*[0-9]}"}'" 'Random 9'
如果尾随文本没有附加数字,则该方法有效。
如果可能有多个数字簇,而您只需要第一个数字,那么它会变得更长并且需要两个附加变量。
$ text='Random 945 and more 752 numbers'
$ lead=${text%%[0-9]*}
$ trail=${text#"$lead"}
$ echo "'$lead${trail%%[!0-9]*}'"
'Random 945'
答案3
您可以使用 bash shell 的正则表达式匹配功能:
$ TEXT='Random text 1 and some more random'
$ [[ $TEXT =~ ^[^0-9]*[0-9] ]] && printf '%s\n' "$BASH_REMATCH"
Random text 1
其中^[^0-9]*[0-9]
匹配零个或多个非数字后跟一个数字,锚定到字符串的开头