쉘 스크립트는 sed/awk를 사용하여 값 쌍을 추출합니까?

쉘 스크립트는 sed/awk를 사용하여 값 쌍을 추출합니까?

다음과 같은 문자열이 주어지면:

NAME="bla" TYPE="test" SIZE="10"

각 쌍의 값을 별도의 쉘 스크립트 변수에 넣고 싶습니다. 예를 들어 세 개의 변수가 있고 첫 번째 변수에 bla 값을 로드하고 두 번째 변수에서 테스트하고 세 번째 변수에서 10을 로드한다고 가정해 보겠습니다.

name=bla
type=test
size=10

내가 지금까지 시도한 것 :

echo \"NAME=\"bla\" TYPE=\"test\" SIZE=\"10\"" | awk '{print Var, $1}'

그러나 이는 값뿐만 아니라 전체 키-값 쌍을 반환합니다. sed나 awk를 사용하여 이를 수행할 수 있는 좋은 방법이 있습니까?

답변1

반드시 권장하지는 않지만 문자열에 포함된 내용과 와일드카드 문자 등이 포함되지 않은 내용을 완전히 제어할 수 있는 경우 다음을 수행할 수 있습니다.

$ cat tst.sh
#!/usr/bin/env bash

str='NAME="bla" TYPE="test" SIZE="10"'
declare $str

echo "NAME=$NAME"
echo "TYPE=$TYPE"
echo "SIZE=$SIZE"

$ ./tst.sh
NAME="bla"
TYPE="test"
SIZE="10"

$ cat tst.sh
#!/usr/bin/env bash

str='NAME="bla" TYPE="test" SIZE="10"'
declare ${str,,}

echo "name=$name"
echo "type=$type"
echo "size=$size"

$ ./tst.sh
name="bla"
type="test"
size="10"

답변2

나는 이 솔루션을 제안합니다:

$ string='NAME="bla" TYPE="test" SIZE="10"'
$ IFS=' ' read -a a <<< "$string"
for i in "${a[@]}"; do
  var="${i%%=*}"
  value="${i##*=}"
  declare "${var,,}"="${value//\"/}"
done

그 다음에

$ echo $name
bla
$ echo $type
test
$ echo $size
10

답변3

이미 더 나은 답변( )이 있지만 declare $str여기에는 다른 옵션을 남겨 두겠습니다.

그리고 source:

source <(echo 'NAME="bla" TYPE="test kkk" SIZE="10"')

그리고 eval:

eval 'NAME="bla" TYPE="test kkk" SIZE="10"'

둘 다 매개변수 이스케이프와 공백(예 SIZE="with a space": )을 처리합니다.

단, 둘 다 매개변수 확장 대상입니다. SIZE="*"또는 SIZE="$(hostname)"확장/작동됩니다.

답변4

확실하지는 않지만 값을 다른 변수에 저장하려면 다음을 수행할 수 있습니다.

echo "NAME="bla" TYPE="test" SIZE="10"" | tr ' ' '\n' | while read line
do
   #this will give you the value. save it in any variable you want.
   name=$(echo $line | awk -F= '{print $2}') 
done

값을 가져온 후 if 조건을 사용하여 값을 기준으로 diff 변수에 저장합니다.

관련 정보