텍스트 파일을 읽고 정의된 내용을 키-값 쌍으로 분할하고 싶습니다. 콘텐츠는 키와 값이 포함된 여러 행입니다. 키에는 공백이 없으므로 첫 번째 공백이 키와 값을 구분합니다. 그러나 값에는 단일 또는 다중 또는 선행 및 후행 공백이 있을 수 있습니다. 내 스크립트는 잘 작동하지만 한 가지 결함이 있습니다. 즉, 여러 공백을 모두 제거한다는 것입니다. 내 값이 파일에 언급된 것과 정확히 같기를 바랍니다.
핵심 스크립트:
#!/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
출력의 각 요소 대신 sed
on 을 사용하여 해당 숫자와 첫 번째 공백을 $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"