문자열에서 텍스트를 추출하여 변수에 저장

문자열에서 텍스트를 추출하여 변수에 저장

이와 같은 문자열이 있고 /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 '/' '-');

관련 정보