이와 같은 문자열이 있고 /feature/abc-1245_branch_name
문자열에서 abc-1245를 추출하여 다른 변수에 저장하려고 합니다.
sed를 사용해 보았으나 잘 작동하지 않았습니다.
답변1
사용 awk
(입력 문자열이 얼마나 변경되는지에 따라):
awk -F[_/] '{print $3}' <<<"$string"
더 복잡한 디렉토리 구조를 처리하려면 기본 이름을 사용하여 시작할 수 있습니다.
basename "$string" | awk -F_ '{print $1}'
변수에 저장하고 사용명령 대체
variable=$(awk -F[_/] '{print $3}' <<<"$string")
답변2
string=/feature/abc-1245_branch_name
different_variable=${string%%_*}
different_variable=${different_variable##*/}
printf '%s\n' "$different_variable"
이는 표준 인수 대체를 사용하여 먼저 첫 번째 밑줄 뒤의 비트를 제거한 다음 마지막 슬래시 앞의 비트를 제거합니다.
${variable%%pattern}
pattern
가장 긴 부분 문자열 일치 제거끝의$variable
.${variable##pattern}
pattern
가장 긴 부분 문자열 일치 제거시작의$variable
.
_branch_name
실제로 무슨 일이 일어나고 있는지 알았다면 ,
string=/feature/abc-1245_branch_name
different_variable=$( basename "$string" '_branch_name' )
printf '%s\n' "$different_variable"
이는 문자열을 경로 이름으로 처리하고(실제 경로 이름이 아닐 수도 있음) basename
마지막 경로 구성 요소(예: "파일 이름")를 가져오는 데 사용됩니다. 이 basename
유틸리티는 파일 이름 접미사도 제거할 수 있으므로 알려진 문자열을 제거하는 데 이 유틸리티를 사용합니다 _branch_name
.
답변3
귀하의 요구 사항 에 따른 답변이 아직 없기 때문에 sed
;
$ string="/feature/abc-1245_branch_name"
$ sed -e 's/^.*\///; s/_.*$//' <<<"$string"
abc-1245
@jesse_b가 제안한 대로 명령 대체를 사용하여 결과를 변수에 넣으세요.
$ result=$(sed -e 's/^.*\///; s/_.*$//' <<<"$string")
$ echo $result
abc-1245
그러나 문자열이 더 복잡해지고 구문 분석 및 구문 분석/필터링 모드가 한 문자열에서 다른 문자열로 변경되지 않는 한 @kusalananda의 순수 Bash 솔루션을 사용합니다. 이것은 내가 여기서 하고 있는 것과 똑같은 일을 합니다 sed
. 즉 탐욕스러운 패턴 일치이지만, 이 간단한 경우에는 순수 Bash가 아마도 "자연스러운" 선택일 것입니다.
답변4
나는 grep을 시도했고 그것은 훌륭하게 작동하고 매우 간단합니다.
$(echo "feature/ABC-BranchName" | grep -Eo 'develop|release|((feature|bugfix|hotfix)/ABC-)([0-9]+)' |tr '/' '-');