Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将多行分隔的子字符串读取到bash数组_Bash - Fatal编程技术网

将多行分隔的子字符串读取到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"