如何使用mapfile / readarray跳过bash中的空行?

时间:2014-10-05 20:57:23

标签: arrays bash associative-array

foo()
{

  mapfile -t arr <<< "${1}"

  for i in "${!arr[@]}"
  do
    if [ -z "${arr[$i]}" ]
    then
      unset arr[$i]
    fi
  done

}

当我传递一个包含一些内容的变量(基本上是一个大字符串)时,我想:

  1. 将第一个空格之前的第一个单词解释为键,第一个空格之后的所有内容都成为我的关联数组中该键的条目
  2. 仅使用换行符跳过空行或行
  3. 示例(紧凑性不包括空行)

    google https://www.google.com
    yahoo https://www.yahoo.com
    microsoft https://www.microsoft.com
    

    数组应该看起来像

    [ google ] == https://www.google.com
    [ yahoo ] == https://www.yahoo.com
    [ microsoft ] == https://www.microsoft.com
    

    我没有在bash手册中找到任何关于2点的好解决方案,你看到的函数foo是一种创建数组的hack,只有在它经过整个数组之后删除字符串为空的条目。

    所以第2点得到一个解决方案,可能效率很低,但是它可以工作,但是第1点仍然没有一个好的解决方案,另一个解决方案就是在用read进行迭代时创建一个数组,据我所知。

    你知道如何改善这个吗?

1 个答案:

答案 0 :(得分:1)

mapfile不会构建关联数组(尽管如果可行,#2最简单的解决方案就是简单地过滤输入,例如grepmapfile -t arr < <(echo "$1" | grep -v "^$")

使用read回退到显式循环,使用=~运算符匹配并跳过空行。

declare -A arr
while read key value; do
    if [[ $value =~ "^\s*$" ]]; then  # Or your favorite regex for skipping blank lines
        continue
    fi
    arr["$key"]="$value"
done <<< "$1"

即使使用while循环,您也可以使用grep跳过空行:

declare -A arr
while read key value; do
   arr["$key"]="$value"
done < <(echo "$1" | grep '^\s*$')