첫 번째 숫자 뒤에 문자열을 얻는 방법은 무엇입니까?

첫 번째 숫자 뒤에 문자열을 얻는 방법은 무엇입니까?

나는 this 형식의 문자열 구조를 가지고 bob-type-8.2-mp2-2017-93-43-11-65-48.spr있으며 8.2-mp2-2017-93-43-11-65-48.

이는 출력 문자열에 첫 번째 숫자 값이 발견된 후 해당 값에서 제거된 이후의 모든 문자가 포함되어야 함을 의미합니다 .spr.

어떻게 해야 하나요?

답변1

이 시도:

echo "bob-type-8.2-mp2-2017-93-43-11-65-48.spr" | sed 's/^[^0-9]*//;s/\.[^.]*$//'

출력은 다음과 같습니다:

8.2-mp2-2017-93-43-11-65-48

설명하다:

sed는 ' 패턴을 사용하여 패턴을 s/pattern/replace_pattern/'찾아 pattern교체합니다.replace_pattern

따라서 패턴은 's/^[^0-9]*//'줄의 시작 부분과 첫 번째 숫자가 나타나기 전의 모든 기호를 가져와 null( replace_pattern비어 있음)로 바꿉니다.

다음 단계 - 확장 프로그램을 제거합니다. 동일한 sed 패턴을 사용하여 이를 수행할 수 있습니다 's///'.

s/\.[^.]*$//.- a로 끝나지 않는 기호를 모두 찾아 $아무것도 없는 기호로 바꿉니다.

;- 분할 모드.

더 나은 이해를 위해 다음 명령을 사용할 수 있습니다.

echo "bob-type-8.2-mp2-2017-93-43-11-65-48.spr" | sed -e 's/^[^0-9]*//' -e 's/\.[^.]*$//'

답변2

배쉬에서는extglob:

$ shopt -s extglob
$ var=bob-type-8.2-mp2-2017-93-43-11-65-48.spr
$ res=${var##*([^0-9])}
$ res=${res%.spr}
$ echo "$res"
8.2-mp2-2017-93-43-11-65-48

*([^0-9])숫자가 아닌 모든 문자열과 일치하며, ${var##pattern}문자열 시작 부분에서 가장 긴 일치 패턴을 제거하고 ${var%pattern}끝에서 (가장 짧은) 일치 패턴을 제거합니다.

답변3

또 다른 방법은 입니다 sed.

sed 's/^[^[[:digit:]]*\(.*\)\.spr$/\1/' <<<"bob-type-8.2-mp2-2017-93-43-11-65-48.spr"
  • ^[^[[:digit:]]*문자열의 시작부터 첫 번째 숫자가 나타날 때까지 모든 항목과 일치합니다.^[^0-9]*

  • \(.*\)위 일치 항목 이후의 모든 항목과 일치하며 \(...\)캡처 그룹 일치에는 괄호가 사용됩니다 \1.역참조.

  • \.spr$spr입력 문자열 끝의 리터럴 포인트 와 일치합니다 .

  • \1캡처된 그룹 일치만 인쇄됩니다.

답변4

POSIX적으로:

string=bob-type-8.2-mp2-2017-93-43-11-65-48.spr
newstring=${string#"${string%%[0-9]*}"}
newstring=${newstring%.*}
  • ${string#pattern}: $string일치하는 콘텐츠를 처음부터 제거합니다 pattern. 이 경우:
  • ${string%%[0-9]*} $string[0-9]*패턴과 일치하는 가장 긴 후행 부분을 제거합니다 . 첫 번째 숫자 앞부분입니다.
  • ${newstring%.*}: $string그것을 빼앗겼다가장 짧은패턴과 일치하는 후행 부분입니다 .*. 따라서 확장 프로그램을 제거하십시오.

그리고 zsh:

newstring=${(M)${string:r}%%[0-9]*}
  • ${string:r}: 다음으로 확장루트 이름(확장자 제거) 좋아요csh
  • ${(M)var%%pattern}, M연산자가 추가한 내용을 반환합니다 %%(그렇지 않은 경우 (M)POSIX 셸의 패턴과 일치하는 끝 부분에서 가장 긴 부분이 제거됩니다).

관련 정보