Bash는 파일을 읽고 공백으로 구분된 키-값 쌍을 얻습니다.

Bash는 파일을 읽고 공백으로 구분된 키-값 쌍을 얻습니다.

텍스트 파일을 읽고 정의된 내용을 키-값 쌍으로 분할하고 싶습니다. 콘텐츠는 키와 값이 포함된 여러 행입니다. 키에는 공백이 없으므로 첫 번째 공백이 키와 값을 구분합니다. 그러나 값에는 단일 또는 다중 또는 선행 및 후행 공백이 있을 수 있습니다. 내 스크립트는 잘 작동하지만 한 가지 결함이 있습니다. 즉, 여러 공백을 모두 제거한다는 것입니다. 내 값이 파일에 언급된 것과 정확히 같기를 바랍니다.

핵심 스크립트:

#!/bin/bash
input="./inp.txt"
while IFS= read -r line
do
    parts=($line)
    key=${parts[0]}
    value=${parts[@]:1:${#parts[@]}}
    echo .
    echo "Key: [$key]"
    echo "Value: [$value]"
    echo .
done < "$input"

입력 파일(inp.txt):

KEY1 VAL1
KEY2   VAL2 has space & multi  spaces &    leading & trailing spaces.  
KEY3 VAL3
KEY4 VAL4
KEY5 VAL5

산출:

Key: [KEY1]
Value: [VAL1]
.
.
Key: [KEY2]
Value: [VAL2 has space & multi spaces & leading & trailing spaces.]
.
.
Key: [KEY3]
Value: [VAL3]
.
.
Key: [KEY4]
Value: [VAL4]
.
.
Key: [KEY5]
Value: [VAL5]

예상: (KEY2-VALUE2 확인)

Key: [KEY1]
Value: [VAL1]
.
.
Key: [KEY2]
Value: [  VAL2 has space & multi  spaces &    leading & trailing spaces.  ]
.
.
Key: [KEY3]
Value: [VAL3]
.
.
Key: [KEY4]
Value: [VAL4]
.
.
Key: [KEY5]
Value: [VAL5]

답변1

표준 POSIX 매개변수 확장을 사용 ${parameter%%word}하여 가장 긴 후행 하위 문자열을 제거하고 ${parameter#word}가장 짧은 선행 하위 문자열을 제거할 수 있습니다.

#!/bin/bash
input="./inp.txt"
while IFS= read -r line
do
    key=${line%% *}
    value=${line#* }
    echo .
    echo "Key: [$key]"
    echo "Value: [$value]"
    echo .
done < "$input"

답변2

출력의 각 요소 대신 sedon 을 사용하여 해당 숫자와 첫 번째 공백을 $line제거 할 수 있습니다 .KEY$parts

#!/bin/bash
input="./inp.txt"
while IFS= read -r line
do
    parts=($line)
    key=${parts[0]}
    value=$(echo "$line" | sed 's/KEY[[:digit:]]*[[:space:]]//')
    echo .
    echo "Key: [$key]"
    echo "Value: [$value]"
    echo .
done < "$input"

관련 정보