Bash:通过分隔符忽略空格来拆分字符串

时间:2017-09-20 23:43:51

标签: linux bash shell unix

我有像

这样的字符串
name1::1.1.1.1::ps -ax

我想使用bash脚本来基于分隔符::拆分字符串。

所需的输出应该是3个元素的数组

("name1" "1.1.1.1" "ps -ax")

没有双引号

感谢您的帮助。

4 个答案:

答案 0 :(得分:4)

假设数组数据中没有:,请使用bash模式替换将::压缩到:,同时将字符串分配给$array ,然后显示整个数组,然后只是元素#2

a="name1::1.1.1.1::ps -ax"
IFS=: array=(${a//::/:}) ; echo ${array[@]} ; echo "${array[2]}" 

输出:

name1 1.1.1.1 ps -ax
ps -ax

但是如果数组数据中有:怎么办?特别是在该字段的第三个字段(命令)和中。将read与虚拟变量一起使用以吸收额外的::分隔符:

a="name1::1.1.1.1::parallel echo ::: 1 2 3 ::: a b"
IFS=: read x a y b z <<< "$a"; array=("$x" "$y" "$z"); printf "%s\n" "${array[@]}"

输出:

name1
1.1.1.1
parallel echo ::: 1 2 3 ::: a b

答案 1 :(得分:1)

唯一安全的可能性是使用循环:

a='name1::1.1.1.1::ps -ax'
array=()

a+=:: # artificially append the separator
while [[ $a ]]; do
    array+=( "${a%%::*}" )
    a=${a#*::}
done

这适用于a中的任何符号(空格,圆角字符,换行符等)

答案 2 :(得分:0)

i=0                                                                            
string="name1::1.1.1.1::ps -ax"                                                
echo "$string" | awk 'BEGIN{FS="::";OFS="\n"}{$1=$1;print $0}'>tempFile            
while read line;                                                               
do                                                                             
  arr["$i"]="$line"                                                                  
  i=$(expr $i + 1)                                                              
done<tempFile                                                                  
echo "${arr[@]}"                                                                
echo "${arr[0]}"                                                                
echo "${arr[1]}"                                                                
echo "${arr[2]}"

输出:

sh-4.4$ ./script1.sh
name1 1.1.1.1 ps -ax
name1
1.1.1.1
ps -ax

答案 3 :(得分:0)

        var filename as listBox.SelectedItem as string;
        if(string.IsNullOrWhiteSpace(filename))
        {
            return;
        }
        var path = Path.Combine(@"C:\", filename);
        var fileinfo = new FileInfo(path);