Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash:通过忽略空格的分隔符拆分字符串_Linux_Bash_Shell_Unix - Fatal编程技术网

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

Linux Bash:通过忽略空格的分隔符拆分字符串,linux,bash,shell,unix,Linux,Bash,Shell,Unix,我有一条像绳子一样的线 name1::1.1.1.1::ps -ax 我想使用bash脚本根据分隔符:拆分字符串 所需的输出应该是由3个元素组成的数组 ("name1" "1.1.1.1" "ps -ax") 没有双引号 非常感谢您的帮助。假设数组数据中没有:s,使用bash模式替换将:压缩为:,同时将字符串分配给$array,然后显示整个数组,然后只显示元素#2: 输出: name1 1.1.1.1 ps -ax ps -ax name1 1.1.1.1 parallel echo ::

我有一条像绳子一样的线

name1::1.1.1.1::ps -ax
我想使用bash脚本根据分隔符
拆分字符串

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

("name1" "1.1.1.1" "ps -ax")
没有双引号


非常感谢您的帮助。

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

输出:

name1 1.1.1.1 ps -ax
ps -ax
name1
1.1.1.1
parallel echo ::: 1 2 3 ::: a b
sh-4.4$ ./script1.sh
name1 1.1.1.1 ps -ax
name1
1.1.1.1
ps -ax

但是如果数组数据中有
s怎么办?特别是在第三个字段(命令)中,并且仅在该字段中。使用带有虚拟变量的
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[@]}"

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

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

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

这将适用于
a
中的任何符号(空格、全局字符、换行符等)

检查一个差异的可能重复:这些链接都指向同一个问题,适用于使用单个字符作为分隔符。这里的问题使用了两个字符作为分隔符。请澄清数据是否可以包含单个
s,例如
ps-eo-pid、tid、class、rtprio、ni、pri、psr、pcpu、stat、wchan:14、comm。但是这些值不能包含任何单个冒号,我想这就是OP首先选择双冒号的原因。不过,您可以用类似
$'\xff'
的不太可能的东西替换双冒号
IFS=$'\xff'数组=(${a/:::://$'\xff'})
@tripleee,与其想象OP的原因,不如让我们来看看。另外,如果
\xff
是一个类似于
并行链接diff{1}{2}::::manifest1 checklist1的命令,那么
${array[2]}
仍然不能正常工作。如果命令包含双冒号,那么显然双冒号首先不是一个好的分隔符。@tripleee同意。这两种方法都会对数据中没有的内容进行假设,并且可能会遇到一些极端情况。更一般的解决方案是,如果数据格式改为使用计数字符串(例如,用于人类可读性的边界分隔符,到下一个分隔符或换行符的字符数,然后是项目数据),例如
:7:name1:9:1.1.1:8:ps-ax
。这不是一个特别好的方案。如果您有复杂的需求,请使用具有定义良好的语义和转义机制(如JSON)的标准数据格式。这并没有特别的帮助,您最好
echo“${value/::/}”
。任务是将单个成员解析为Bash数组。
sh-4.4$ ./script1.sh
name1 1.1.1.1 ps -ax
name1
1.1.1.1
ps -ax
echo "name1::1.1.1.1::ps -ax" | awk -F"::" '{print $1 $2 $3}'
a='name1::1.1.1.1::ps -ax'
array=()

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