Bash 組み込みサブストリング

Bash 組み込みサブストリング
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

数値セットが1つしかない場合は、2つのステップ(1つの拡張)で実行できます。

  • 数字で終わる最長の前のテキストを削除します。

    $ text='Random 923 and more'
    $ echo "'${text##*[0-9]}'"
    ' and more'
    
  • 次に、元の文字列から選択した末尾のテキストを削除します。

    $ echo "'${text%"${text##*[0-9]}"}'"
    'Random 9'
    

この方法は、末尾のテキストに数字が追加されていない場合に機能します。

複数の数値クラスターがあり、最初の数字のみが必要な場合は、数字が長くなり、2つの追加変数が必要です。

$ text='Random 945 and more 752 numbers'
$ lead=${text%%[0-9]*}
$ trail=${text#"$lead"}
$ echo "'$lead${trail%%[!0-9]*}'"
'Random 945'

答え3

Bash シェルの正規表現一致機能を使用できます。

$ 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]ゼロ以上の数字ではなく、数字と文字列の先頭に固定された数字と一致します。

関連情報