我在将以下变量的数据处理到动态数组时遇到问题
variable_1='A|B|C|D' -> dynamic_array=(A B C D)
我尝试使用 sed 命令来替换 '|'有空间以及如何将数据传递给dynamic_array
他们有什么办法可以在一行代码内实现吗?
答案1
无需改变IFS
,从 Bash 4.4 开始:
readarray -td '|' arr < <(printf '%s' "$var")
$ var='A|B|C|D'
$ readarray -td '|' arr < <(printf '%s' "$var")
$ echo "${arr[0]}"; echo "${arr[3]}"
A
D
看help readarray
进行解释。
注意:我之前的建议 ( readarray -td '|' arr <<< "$var"
) 虽然比较简短,但会在最后一个数组元素处插入一个虚假的换行符,正如 Freddy 指出的那样。
答案2
假设bash
:
您可以利用分词。内部字段分隔符 (IFS) 默认为空格、制表符或换行符。但是您可以通过设置IFS
环境变量来覆盖它,然后您可以使用正常的方法来创建变量:
set -f # disable filename expansion
IFS='|' arr=($variable_1)
或者declare
:
IFS='|' declare -a 'arr=($variable_1)'
或者read
:
IFS='|' read -ra arr <<< "$variable_1"
如果像这样更改IFS
变量,您可能需要先将其保存在另一个变量中,然后再重置:
OLD_IFS="$IFS"
# my commands
IFS="$OLD_IFS"
答案3
假设zsh
,您可以使用s
参数扩展标志,该标志将适用于元素包含的任何字符或非字符:
$ string=$'first element|second\nbinary\x80element\0||second-last|'
$ array=("${(@s[|])string}")
$ typeset -p string array
typeset string=$'first element|second\nbinary\M-\C-@element\C-@||second-last|'
typeset -a array=( 'first element' $'second\nbinary\M-\C-@element\C-@' '' second-last '' )
请注意,空字符串被拆分为一个空元素(string=''
gets array=( '' )
, not array=( )
)。