Le Sun, Jan 12, 2025 at 04:10:03PM -0500, Chet Ramey a écrit :
>
> This is a simplified version how it works: after you remove leading
> and trailing IFS whitespace, you read individual fields from the input
> using the characters in IFS as field terminators.
> If you get to the last variable and find a field terminator (in this
> case, the end of input qualifies as a field terminator), you check
> whether there is additional input.
> If there is, you just end the process there and assign whatever input
> followed the previous delimiter you found to the last variable,
> delimiters included. If not, the field is terminated and assigned to
> the last variable.
Re-reading man page and this discussion, I thing either this variable is
wrongly named "IFS", as `S` stand for "separator", either the man page
paragraph regarding "IFS" is something light.
Btw, the command "mapfile" (readarray) seem more suitable** than "read" for
splitting an array on delimiter. (** constant)
$ 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=''
--
Félix Hauri - <[email protected]> - http://www.f-hauri.ch