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"

相关内容