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.

Original source

Related problems