Bash
將帶有換行符分隔的單詞的字元串放入數組中
我目前有
bash
一個變數,它包含一個類似於這個的字元串,其中每個不同的片語由換行符分隔:
var="1st word 2nd word 4th word"
"2nd word"
注意和之間有一個空格"4th word"
。我想將這些片語放入一個數組中,將空字元串保留在第二個索引中:
arr=("1st word" "2nd word" "" "4th word")
我嘗試了以下程式碼,但似乎忽略了空格。
IFS=$'\n' read -rd '' -a arr <<<"$var"
有人碰巧對此有解決方案嗎?
謝謝你。
您的方法的問題在於它依賴於使用IFS 空白字元(即換行符)的分詞。如中所述
man bash
:Any character in IFS that is not IFS whitespace, along with any adjacent IFS whitespace characters, delimits a field. **A sequence of IFS whitespace characters is also treated as a delimiter.**
因此,無論您傳遞給
read
,的任何選項"$var"
都已被拆分為 3 個標記,將空的第 3 行兩側的相鄰換行符視為單個分隔符。從 bash 版本 4.0 開始,您可以改為使用
readarray
(或其同義詞,mapfile
)來讀取整行:$ var="1st word 2nd word 4th word" $ readarray -t arr <<<"$var" $ declare -p arr declare -a arr=([0]="1st word" [1]="2nd word" [2]="" [3]="4th word")
如果您的 bash 太舊而無法提供
readarray
/mapfile
,那麼您可以使用循環來完成:$ arr=() $ while IFS= read -r line; do arr+=("$line"); done <<<"$var" $ declare -p arr declare -a arr=([0]="1st word" [1]="2nd word" [2]="" [3]="4th word")