小编典典

将多行字符串转换为数组

all

我有这个脚本:

nmapout=`sudo nmap -sP 10.0.0.0/24`
names=`echo "$nmapout" | grep "MAC" | grep -o '(.\+)'`
echo "$names"

现在$names变量包含用换行符分隔的字符串:

>_
 (Netgear)
 (Hon Hai Precision Ind. Co.)
 (Apple)

我尝试使用子字符串方法进行数组转换:

names=(${names//\\n/ })
echo "${names[@]}"

${names[$i]但问题是,如果我运行这个循环,我无法通过索引(即等)访问它们

for (( i=0; i<${#names[@]}; i++ ))
do
     echo "$i: ${names[$i]"
     # do some processing with ${names[$i]}
done

我得到这个输出:

>_
 0: (Netgear)
 1: (Hon
 2: Hai

但我想要的是:

>_
 0: (Netgear)
 1: (Hon Hai Precision Ind. Co.)
 2: (Apple)

我想不出一个好的方法来做到这一点,请注意第二个字符串中有空格。


阅读 80

收藏
2022-05-20

共1个答案

小编典典

设置IFS(内部字段分隔符)。Shell 使用该IFS变量来确定字段分隔符是什么。默认情况下,IFS设置为空格字符。将其更改为换行符,如下所示:

#!/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

输出

0: Netgear
1: Hon Hai Precision Ind. Co.
2: Apple
2022-05-20