arrays - 将多行字符串转换为数组

标签 arrays bash newline

<分区>

我有这个脚本:

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)

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

最佳答案

设置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

关于arrays - 将多行字符串转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24628076/

相关文章:

javascript - 我可以更改脚本 src 并让 javascript 运行新代码吗?

bash - 我的 WHILE-DO 循环出了什么问题,或者为什么我的脚本找不到我在盘子上提供的文件?

c# - 从异常换行规范化文本文件?

java - 显示多个结果数组搜索

java - ArrayList 声明之间的区别

c++ - 如何使用 "new"而不是 malloc 分配内存?

linux - 以 headless 模式将 libreoffice 电子表格合并到多页文档中?

linux - 如何通过 unix shell 脚本从远程服务器为特定用户发送电子邮件

C 文件顶部新行

ruby - 使用空格拆分字符串,同时将\n 保留为单独的元素