bash:转换' \ n'将字符串分隔成数组

时间:2014-07-08 09:17:04

标签: 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)

我无法找到一个好方法,请注意第二个字符串中有空格。

有什么想法吗?

4 个答案:

答案 0 :(得分:23)

设置IFS。 Shell使用IFS变量来确定字段分隔符。默认情况下,IFS设置为空格字符。将其更改为换行符。

#!/bin/bash
names="Netgear
Hon Hai Precision Ind. Co.
Apple"

SAVEIFS=$IFS   # Save current IFS
IFS=$'\n'      # Change IFS to new line
names=($names) # split to array $names
IFS=$SAVEIFS   # Restore IFS

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

输出

0: Netgear
1: Hon Hai Precision Ind. Co.
2: Apple

答案 1 :(得分:9)

让我为Sanket Parmar's answer做出贡献。如果您可以将字符串拆分和处理提取到单独的函数中,则无需保存和恢复cudaMemcpy(host, device, size * sizeof(int), cudaMemcpyDevicetoHost) - 请改为使用$IFS

local

另见:

答案 2 :(得分:1)

Bash还具有readarray内置命令,可在手册页中轻松搜索。它使用换行符(\n)作为默认定界符,并使用MAPFILE作为默认数组,因此可以这样做:

    names="Netgear
    Hon Hai Precision Ind. Co.
    Apple"

    readarray -t <<<$names

    printf "0: ${MAPFILE[0]}\n1: ${MAPFILE[1]}\n2: ${MAPFILE[2]}\n"

-t选项删除定界符('\n'),以便可以在printf中显式添加定界符。输出为:

    0: Netgear
    1: Hon Hai Precision Ind. Co.
    2: Apple

答案 3 :(得分:0)

正如其他人所说,IFS将为您提供帮助。IFS=$'\n' read -ra array <<< "$names" 如果您的变量的字符串带有空格,请将其放在双引号之间。 现在,您可以通过{array[@]}

轻松获取数组中的所有值