bash : 한 번에 여러 문자열 조작 (매개 변수 확장)을 사용하는 방법은 무엇입니까?
나는이 string=substr1-substr2-substr3.substr4
하위 문자열이 가변 길이있는 곳. 나는 추출 할 substr3
에서 string
하고 사용하며 그 일을 생각하고 ${string##pattern}
와 ${string%pattern}
문자열 조작 확장을. 이 접근 방식을 사용 하면 결과 확장 을 실행 ${string##*-}
하고 실행 해야하며 ${string%.*}
그 반대의 경우도 마찬가지입니다. 내 질문은 다음과 같습니다.
- 이것이 최선의 선택입니까?
- 그렇다면 한 번에 두 가지를 모두 실행하려면 어떻게해야합니까? 내가 같은 것을 시도
${string##*-${string%.*}}
하거나${string%.*${string##*-}}
전체 문자열을 되 찾을 때. 첫 번째 단계의 결과에 중간 변수를 할당 한 다음이를 조작하여 항상 두 단계로 추출을 수행 할 수 있다는 것을 알고 있습니다. 하지만 한 단계로하고 싶습니다. 어떻게해야합니까?
TIA!
답변
주어진
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
.