将多行分隔的子字符串读取到bash数组
我想创建一个包含将多行分隔的子字符串读取到bash数组,bash,Bash,我想创建一个包含 Speed: 10500 Mbps Size: 122400 MB Load: 4544 Kg Distance: 232680 miles Acceleration: 11200 meters/s2 Deviation: 1100 Wierdos 从以下代码: read -r -d '' TEST_STRING << EOM Speed: 10500 Mbps; Size: 122400 MB Load: 4544 Kg; Distance: 232680 mi
Speed: 10500 Mbps
Size: 122400 MB
Load: 4544 Kg
Distance: 232680 miles
Acceleration: 11200 meters/s2
Deviation: 1100 Wierdos
从以下代码:
read -r -d '' TEST_STRING << EOM
Speed: 10500 Mbps; Size: 122400 MB
Load: 4544 Kg; Distance: 232680 miles
Acceleration: 11200 meters/s2; Deviation: 1100 Wierdos
EOM
STRINGS_ARRAY=()
RE_INTRALINEDELIMITER=";"
while IFS=$'\n' read -a LINE; do
if [[ $LINE =~ $RE_INTRALINEDELIMITER ]]; then
echo "(intraline): $LINE"
while IFS=$';' read -a SUBSTR; do
echo "(substr): $SUBSTR"
done <<< "$LINE"
fi
done <<< "$TEST_STRING"
read-r-d''使用read-ra
测试字符串,您基本上是在读取数组SUBSTR
,但仅尝试在字符串变量的上下文中打印它。尝试打印整个阵列,其中应存储完整的行
echo "(substr): ${SUBSTR[@]}"
还请注意前面代码中的-a
用法,即将整行存储为数组
另外,如果安装了最新版本的bash
,请尝试使用mapfile
/readarray
将多行输出解析为数组。你的全部要求很可能降低到
re_delimiter=';'
mapfile -t stringArray <<<"$TEST_STRING"
现在将整个数组内容打印为
declare -p wholeArray
declare -a wholeArray='([0]="Speed: 10500 Mbps" [1]=" Size: 122400 MB" [2]="Load: 4544 Kg" [3]=" Distance: 232680 miles" [4]="Acceleration: 11200 meters/s2" [5]=" Deviation: 1100 Wierdos")'
(或)使用适当的for循环一次打印一个元素
for entry in "${wholeArray[@]}"; do
printf '%s\n' "$entry"
done
还应始终使用大写变量来存储变量名,以避免与shell维护的环境变量混淆。另一种拆分字符串的方法,使用shell扩展并避免读取缓慢的字符串:
tmp=$TEST_STRING
while [[ $tmp = *[\;$'\n']* ]]; do
item=${tmp%%[;$'\n']*} # to remove the largest suffix starting with ; or newline
tmp=${tmp#*[;$'\n']} # to remove the shortest prefix ending with ; or new line
echo "[$item]"
done
使用读取两次;一次得到一条线,然后再次拆分该线
test_string='Speed: 10500 Mbps; Size: 122400 MB
Load: 4544 Kg; Distance: 232680 miles
Acceleration: 11200 meters/s2; Deviation: 1100 Wierdos'
while IFS= read -r line; do
IFS=";" read -r fields <<< "$line"
strings_array+=("${fields[@]}")
done <<< "$test_string"
测试速度:10500 Mbps;大小:122400 MB
负荷:4544公斤;距离:232680英里
加速度:11200米/秒2;偏差:1100维多斯'
而IFS=读取-r行;做
IFS=“;”read-r字段我的答案是否适合您。我做了一个编辑,应该可以解决你的问题。我检查了你下面的答案(作者:Nahuel Fouilleul)。在我核对你的答案时,你能看一下是否合适吗?对不起。我不能就不是我的答案提供反馈。然而,我会推荐更有效的方法,因为您的尝试和我的答案已经尝试过了。您能告诉我在我更改数组中的某些项后如何恢复字符串吗?这似乎是一个完全不同的问题。你能关闭这个,重新打开一个新的,并在你的尝试中完全陈述你的需求吗?
test_string='Speed: 10500 Mbps; Size: 122400 MB
Load: 4544 Kg; Distance: 232680 miles
Acceleration: 11200 meters/s2; Deviation: 1100 Wierdos'
while IFS= read -r line; do
IFS=";" read -r fields <<< "$line"
strings_array+=("${fields[@]}")
done <<< "$test_string"