단일 변수에서 여러 변수 할당에 해당하는 텍스트 생성

단일 변수에서 여러 변수 할당에 해당하는 텍스트 생성

다음과 같은 값을 갖는 변수가 있습니다

line=dog,/path1,/path2

내가 원하는 것은 값에서 변수를 생성하는 것입니다. 즉, dog변수가 되어야 하며 다음 출력을 얻고 싶습니다.

dog=/path1,/path2
dog1=/path1
dog2=/path2

마찬가지로, line=bull,/val1,/val2다음 출력이 필요합니다.

bull=/val1,/val2
bull1=/val1
bull2=/val2

쉼표로 구분된 값 은 line세 개뿐입니다.

답변1

나는 이것이 당신이하고 싶은 일이라고 생각합니다 :

line='dog,/path1,/path2'
IFS=', ' read -r -a dog <<< "$line"

echo "$dog"
dog
echo "${dog[1]}"
/path1
echo "${dog[2]}"
/path2 

이것은 쉘이 bash라고 가정합니다.

답변2

Bash 중심 솔루션은 다음과 같습니다.

IFS=, read -r -a vars <<<"$line"
printf "%s\n" "${vars[0]}=${vars[1]},${vars[2]}" "${vars[0]}1=${vars[1]}" "${vars[0]}2=${vars[2]}"

첫 번째 줄은 $line변수를 쉼표를 기준으로 여러 부분으로 나눕니다. 두 번째 줄은 안쪽에서 바깥쪽으로 작업합니다.

  1. 첫 번째 값(예: "dog"), 등호, 두 번째 값을 인쇄합니다.
  2. 1등호가 붙은 첫 번째 값을 출력한 다음 두 번째 값을 출력합니다.
  3. 등호가 접미어 로 붙은 첫 번째 값을 출력한 2다음 세 번째 값을 출력합니다.
  4. printf이 세 문자열은 개행 문자로 구분됩니다.

귀하의 질문과 마찬가지로 이 답변도 $line.

입력 및 출력 예(앞에 $쉘 프롬프트가 옴):

$ line=dog,/path1,/path2
$ IFS=, read -r -a vars <<<"$line"
$ printf "%s\n" "${vars[0]}=${vars[1]},${vars[2]}" "${vars[0]}1=${vars[1]}" "${vars[0]}2=${vars[2]}"
dog=/path1,/path2
dog1=/path1
dog2=/path2

printf 출력을 파일로 쉽게 리디렉션할 수 있습니다.

답변3

를 사용하는 경우 bash다음을 수행할 수 있습니다( echo각 단계에서 발생하는 상황을 보여주는 추가 명령문 사용).

$ line=dog,/path1,/path2

$ newline=$(printf "%s\n" "$line" | 
            perl -n -e 'BEGIN {$count=1};
                        my ($var,@values) = split /,/;
                        print "$var=" . join(",",@values);
                        foreach (@values) {
                            printf "%s%i=\"%s\" ",$var, $count++, $_
                        }')

$ echo "$newline"
dog=/path1,/path2 dog1=/path1 dog2=/path2

$ declare $newline

$ declare | grep '^dog'
dog=/path1,/path2
dog1=/path1
dog2=/path2

perl쉼표로 구분하는 데 사용됩니다 . $line첫 번째 필드는 에 저장 $var되고 나머지 필드는 이름이 지정된 배열에 저장됩니다 @values. 그런 다음 declare변수를 설정하기 위해 bash 명령과 함께 사용하기에 적합한 출력을 생성합니다 .

이 줄에서는 큰따옴표를 사용하지 않으며 사용해서 도 $newline안 됩니다 . declare큰따옴표로 묶으면 공백으로 구분된 declare세 개의 인수 대신 하나의 인수만 얻게 됩니다.

여기서 인용 부족으로 인한 불쾌한 부작용은 다음과 같습니다.declare ~ 할 것이다필드 값에 공백 문자 등이 포함되어 있으면 실패합니다. 예를 들어 line=dog,/path /with / spaces,/path2. 필요한 경우 스크립트의 print및 문에서 printf적절한 참조를 출력하여 이 문제를 해결할 수 있습니다 perl. 및/또는 $newline문자열 대신 bash 배열로 정의됩니다. 여기에서 사용된 원리/기술을 충분히 보여주었으므로 독자를 위한 연습으로 남겨둡니다.

내보낸 변수로 선언하려면 다음을 사용하세요.

declare -x $newline

자세한 내용은 을 참조하세요 help declare.

그런데 에서는 대신 을 ksh사용할 수 있습니다 . 또한 지원되지만 더 이상 사용되지 않는 것으로 간주됩니다( 참조 ) .typesetdeclaretypesetbashhelp typesetbash


마지막으로: 개별 변수 대신 쉘 배열 변수(예 dog[0]=/path1,/path2: , dog[1]=/path1및 ) 를 사용하는 것을 좋아하지 않으십니까 ? dog[2]=/path2이것이 그들의 존재 목적입니다.

답변4

이런 식으로 할 수 있습니다. 나는 당신이 한 것처럼 선을 정의했습니다. 다음으로, 줄에서 첫 번째 쉼표로 구분된 토큰을 구문 분석합니다(변수 이름에 유효하다고 가정합니다). 그런 다음 첫 번째 태그를 기반으로 두 개의 새 변수를 생성하고 이를 행의 두 번째 및 세 번째 쉼표로 구분된 태그에 할당합니다.

line="dog,/path1,/path2"
first="$(echo "${line}" | awk -F, '{ print $1 }')"
eval "${first}1=$(echo "${line}" | awk -F, '{ print $2 }')"
eval "${first}2=$(echo "${line}" | awk -F, '{ print $3 }')"

echo "${dog1}"
/path1
echo "${dog2}"
/path2

관련 정보