bash : 한 번에 여러 문자열 조작 (매개 변수 확장)을 사용하는 방법은 무엇입니까?

Aug 15 2020

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

  1. 이것이 최선의 선택입니까?
  2. 그렇다면 한 번에 두 가지를 모두 실행하려면 어떻게해야합니까? 내가 같은 것을 시도 ${string##*-${string%.*}}하거나 ${string%.*${string##*-}}전체 문자열을 되 찾을 때. 첫 번째 단계의 결과에 중간 변수를 할당 한 다음이를 조작하여 항상 두 단계로 추출을 수행 할 수 있다는 것을 알고 있습니다. 하지만 한 단계로하고 싶습니다. 어떻게해야합니까?

TIA!

답변

2 ilkkachu Aug 15 2020 at 20:39

주어진

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에서는 한 단계로 할 수 있지만 Bash에서는 작동하지 않습니다.result=${${string%.*}##*-}

Bash에서는 #또는 의 오른쪽에 확장을 사용하는 것으로 제한되며 %문자열의 시작과 끝에서 부분을 제거해야하므로 여기서 도움이되지 않습니다.


또는 $string개행 문자가 포함되지 않은 경우 다음을 사용할 수 있습니다.

IFS=.- read -r a b c d <<< "$string"

에서 읽 substr3습니다 c.

이 경우 셸과 문자열의 크기에 따라의 내용은 $string임시 파일에 저장되거나 파이프를 통해 공급 read되어 첫 번째 줄을 읽고에 따라 분할합니다 $IFS.