On Mon, Jan 13, 2025, at 3:03 AM, Félix Hauri wrote: > Re-reading man page and this discussion, I thing either this variable is > wrongly named "IFS", as `S` stand for "separator"
Okay. Not like it's going to change. > Btw, the command "mapfile" (readarray) seem more suitable** than "read" for > splitting an array on delimiter. (** constant) "Suitable" and "constant" don't mean remotely the same thing. Perhaps you mean "consistent". > $ printf ' %-15s %-30s%s\n' String by\ Read{,Array};while IFS= read -r > line; > do > IFS=: read -r _k _v1 _v2 <<<"$line" > readarray -td: array < <(printf %s "$line"); > k="${array[0]}" v1="${array[1]}"; > IFS=:; v2=${array[*]:2}; IFS=$' \t\n'; > printf " %-15s k=%-3s v1=%-4s v2=%-11s k=%-3s v1=%-4s v2=%-11s\n" \ > "${line@Q}" "${_k@Q}" "${_v1@Q}" "${_v2@Q}" \ > "${k@Q}" "${v1@Q}" "${v2@Q}"; > done < <( > printf '%s\n' \ > k{:v1{:v2{:v3{:{:{:,},},},:{:{:,},},},:{:{:,},},},:{:{:,},},} ) > > String by Read by ReadArray > 'k:v1:v2:v3:::' k='k' v1='v1' v2='v2:v3:::' k='k' v1='v1' v2='v2:v3::' > 'k:v1:v2:v3::' k='k' v1='v1' v2='v2:v3::' k='k' v1='v1' v2='v2:v3:' > 'k:v1:v2:v3:' k='k' v1='v1' v2='v2:v3:' k='k' v1='v1' v2='v2:v3' > 'k:v1:v2:v3' k='k' v1='v1' v2='v2:v3' k='k' v1='v1' v2='v2:v3' > 'k:v1:v2:::' k='k' v1='v1' v2='v2:::' k='k' v1='v1' v2='v2::' > 'k:v1:v2::' k='k' v1='v1' v2='v2::' k='k' v1='v1' v2='v2:' > 'k:v1:v2:' k='k' v1='v1' v2='v2' k='k' v1='v1' v2='v2' > 'k:v1:v2' k='k' v1='v1' v2='v2' k='k' v1='v1' v2='v2' > 'k:v1:::' k='k' v1='v1' v2='::' k='k' v1='v1' v2=':' > 'k:v1::' k='k' v1='v1' v2='' k='k' v1='v1' v2='' > 'k:v1:' k='k' v1='v1' v2='' k='k' v1='v1' v2='' > 'k:v1' k='k' v1='v1' v2='' k='k' v1='v1' v2='' > 'k:::' k='k' v1='' v2='' k='k' v1='' v2='' > 'k::' k='k' v1='' v2='' k='k' v1='' v2='' > 'k:' k='k' v1='' v2='' k='k' v1='' v2='' > 'k' k='k' v1='' v2='' k='k' v1='' v2='' What exactly is all of this supposed to demonstrate? mapfile has the same terminator-not-separator behavior everyone is kvetching about: $ printf 'a:b:c:' | { mapfile -td:; declare -p MAPFILE; } declare -a MAPFILE=([0]="a" [1]="b" [2]="c") Reading a line and splitting it into an array like this is what read -a is for. -- vq