![Bash读取文件并获取由空格分隔的键值对](https://linux22.com/image/200019/Bash%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6%E5%B9%B6%E8%8E%B7%E5%8F%96%E7%94%B1%E7%A9%BA%E6%A0%BC%E5%88%86%E9%9A%94%E7%9A%84%E9%94%AE%E5%80%BC%E5%AF%B9.png)
我想读取一个文本文件并将其定义的内容拆分为键值对。内容是带有键和值的多行。其中键不会有空格,因此第一个空格将键和值分开。但该值可以有单个或多个或前导和尾随空格。我的脚本运行良好,但有一个缺陷,即它删除了所有多空格。我希望我的值与文件中提到的完全相同。
核心脚本:
#!/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"