![첫 번째 숫자 뒤에 문자열을 얻는 방법은 무엇입니까?](https://linux55.com/image/118993/%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20%EC%88%AB%EC%9E%90%20%EB%92%A4%EC%97%90%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EC%96%BB%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
나는 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 셸의 패턴과 일치하는 끝 부분에서 가장 긴 부분이 제거됩니다).