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

숫자 세트가 하나만 있는 경우 두 단계(하나의 확장)로 수행할 수 있습니다.

  • 숫자로 끝나는 가장 긴 선행 텍스트를 제거합니다.

    $ 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 셸의 정규식 일치 기능을 사용할 수 있습니다.

$ 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]0개 이상의 숫자가 아닌 숫자와 문자열의 시작 부분에 고정된 숫자와 일치합니다 .

관련 정보