Bash 内置 Substring

Bash 内置 Substring
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]匹配零个或多个非数字后跟一个数字,锚定到字符串的开头

相关内容