2014-10-05 53 views
0
foo() 
{ 

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

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

} 

當我通過與它的一些內容(大串基本上)一個變量,我想:如何跳過帶mapfile/readarray的bash中的空行?

  1. 第一空格作爲第一個空格後的關鍵,之前的一切解釋的第一個字成爲在我的關聯數組該密鑰的條目
  2. 跳過空行或只用一個換行

例如(不包括用於緊湊空行)

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,你看到它是一種創建數組的黑客攻擊並且只有在它遍歷整個數組並刪除字符串爲空的條目後。

所以點2得到的解決方案,可能是一個低效的,但它的工作原理,但1點還沒有一個很好的解決方案,而另一種方法是隻創建一個陣列,同時在與read迭代,就我知道 。

你知道如何改善嗎?

+0

也有一個原因,爲什麼我不願意使用'read','read'通常會將條目混洗,並且不會複製原始順序,'mapfile'通常會保持與原始順序相同的順序字符串/文件。 – user2485710 2014-10-05 21:08:15

+0

'mapfile'以原始順序保存所有內容,因爲它不會創建關聯數組。 'read'與你構建的數組無關,但是當你使用它時,實際上你實際上是將一個項目添加到一個關聯數組中。 – chepner 2014-10-05 21:09:50

+0

@chepner這就是我想要的,一個'mapfile'創建了我的文章中描述的關聯數組,我沒有關於這兩個點是否可行的最後一句話,只用了bash中的內建命令。 – user2485710 2014-10-05 21:11:46

回答

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" 

您也可以跳過使用grep空行甚至與while循環:

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

是的,這是我的_fallback_解決方案,也許根據我得到的輸入類型,使用自定義的'IFS',所以這不適用於bash? – user2485710 2014-10-05 21:17:53