Zsh 만 대답합니다 ...

Zsh 만 대답합니다 ...

내 하위 문자열은 string=substr1-substr2-substr3.substr4가변 길이입니다. 나는 substr3그것에서 추출 하고 싶고 그것을 수행하기 위해 문자열 조작 확장을 사용 string하려고 생각하고 있습니다 . 이 접근 방식을 사용하면 생성된 확장 프로그램을 계속 해서 실행해야 하며 그 반대의 경우도 마찬가지입니다. 내 질문은 다음과 같습니다${string##pattern}${string%pattern}${string##*-}${string%.*}

  1. 이것이 최선의 선택입니까?
  2. 그렇다면 어떻게 한 단계에서 두 가지를 모두 실행할 수 있습니까? 내가 ${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##*-}%.*}

관련 정보