Bash

將帶有換行符分隔的單詞的字元串放入數組中

  • July 29, 2021

我目前有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")

引用自:https://unix.stackexchange.com/questions/660419