내 하위 문자열은 string=substr1-substr2-substr3.substr4
가변 길이입니다. 나는 substr3
그것에서 추출 하고 싶고 그것을 수행하기 위해 문자열 조작 확장을 사용 string
하려고 생각하고 있습니다 . 이 접근 방식을 사용하면 생성된 확장 프로그램을 계속 해서 실행해야 하며 그 반대의 경우도 마찬가지입니다. 내 질문은 다음과 같습니다${string##pattern}
${string%pattern}
${string##*-}
${string%.*}
- 이것이 최선의 선택입니까?
- 그렇다면 어떻게 한 단계에서 두 가지를 모두 실행할 수 있습니까? 내가
${string##*-${string%.*}}
뭔가를 하려고 할 때 또는${string%.*${string##*-}}
나는 단지 완전한 문자열을 돌려받습니다. 첫 번째 단계의 결과에 중간 변수를 할당하고 이에 대해 작업을 수행하면 항상 두 단계로 추출을 수행할 수 있다는 것을 알고 있지만 한 단계로 수행하고 싶습니다. 나는 무엇을 해야 합니까?
티아!
답변1
주어진
string=substr1-substr2-substr3.substr4
${string%.*}
예
substr1-substr2-substr3
그렇죠${string##*-${string%.*}}
${string##*-substr1-substr2-substr3}
이는 string
처음부터 포함하여 모든 것을 삭제하는 것을 의미합니다 -substr1-substr2-substr3
. 그러나 string
앞에 대시가 없기 때문에 그러한 하위 문자열이 없으므로 substr1
원래 문자열을 얻습니다.
아마도 당신이 원하는 것은
string=substr1-substr2-substr3.substr4
result="${string%.*}"
result="${result##*-}"
이로 result
인해 포함이 발생합니다 substr3
.
Zsh에서는 한 단계로 이를 수행할 수 있지만 result=${${string%.*}##*-}
Bash에서는 작동하지 않습니다.
#
Bash에서는 or 의 오른쪽에서만 확장을 사용할 수 있습니다 %
. 이는 문자열의 시작과 끝 부분을 제거해야 하기 때문에 도움이 되지 않습니다.
또는 $string
개행 문자를 포함하지 않으면 다음을 사용할 수 있습니다.
IFS=.- read -r a b c d <<< "$string"
그리고 substr3
에서 읽어보세요 c
.
이 경우 셸과 문자열 크기에 따라 의 내용은 $string
임시 파일에 저장되거나 파이프를 통해 공급되어 read
첫 번째 줄을 읽고 그에 따라 분할됩니다 $IFS
.
답변2
이 질문은 bash에 관한 것이지만 Zsh를 사용하고 검색을 통해 이 문제를 겪는 사람에게는 도움이 될 수 있습니다.
Zsh 만 대답합니다 ...
...다른 쉘이 있을 수도 있지만 bash는 아닐 수도 있습니다(5.1.16)
Zsh에서 여러 문자열 교체를 수행하려면 중첩할 수 있습니다.매개변수 확장:
string=substr1-substr2-substr3.substr4
result=${${string##*-}%.*}