Convert multiline string to array
arrays, bash, newline
Solution
Set `IFS` (Internal Field Separator). Shell uses the `IFS` variable to determine what the field separators are. By default, `IFS` is set to the space character. Change it to the newline character, as demonstrated below:
#!/bin/bash
names="Netgear
Hon Hai Precision Ind. Co.
Apple"
SAVEIFS=$IFS # Save current IFS (Internal Field Separator)
IFS=$'\n' # Change IFS to newline char
names=($names) # split the `names` string into an array by the same name
IFS=$SAVEIFS # Restore original IFS
for (( i=0; i<${#names[@]}; i++ ))
do
echo "$i: ${names[$i]}"
done
Output
0: Netgear
1: Hon Hai Precision Ind. Co.
2: Apple
Problem
I have this script: ``` nmapout=`sudo nmap -sP 10.0.0.0/24` names=`echo "$nmapout" | grep "MAC" | grep -o '(.\+)'` echo "$names" ``` now the `$names` variable contains strings delimited with newlines: ``` >_ (Netgear) (Hon Hai Precision Ind. Co.) (Apple) ``` I tried to do the array conversion with the sub-string approach: ``` names=(${names//\\n/ }) echo "${names[@]}" ``` But the problem is that I can't access them by indexing (i.e., `${names[$i]` etc.), if I run this loop ``` for (( i=0; i<${#names[@]}; i++ )) do echo "$i: ${names[$i]" # do some processing with ${names[$i]} done ``` I get this output: ``` >_ 0: (Netgear) 1: (Hon 2: Hai ``` but what I want is: ``` >_ 0: (Netgear) 1: (Hon Hai Precision Ind. Co.) 2: (Apple) ``` I could not figure out a good way to do this, please note that the second string has spaces in it.