You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash中提取[]间所有字符串并加载到数组中

解决Bash中提取[]间内容到数组的问题

我懂你之前的困扰——用sed那个命令只能拿到最后一个匹配项,根本没法把所有内容都放进数组里。下面给你几个实用的方案,不管内容里有没有空格,都能准确提取到数组中:

方法一:用Bash内置正则(无外部工具,最可靠)

这个方法完全依赖Bash自身的功能,不需要调用grep、awk这些工具,处理带空格的内容也毫无问题:

# 你的原始字符串
var="[a1] [b1] [123] [Text text] [0x0]"
# 初始化空数组
arr=()
# 定义匹配正则:捕获[]之间的内容
pattern='\[([^\]]+)\]'

# 循环匹配直到没有结果
while [[ $var =~ $pattern ]]; do
    # 把捕获到的内容加入数组(BASH_REMATCH[1]是第一个捕获组的内容)
    arr+=("${BASH_REMATCH[1]}")
    # 移除已经匹配过的部分(包括[]),继续匹配剩下的字符串
    var=${var#*"${BASH_REMATCH[0]}"}
done

# 验证结果
for item in "${arr[@]}"; do
    echo "$item"
done

运行后你会得到:

a1
b1
123
Text text
0x0

数组里的每个元素都和你想要的完全一致,包括带空格的Text text。

方法二:用grep + readarray(简洁高效)

如果习惯用grep,可以结合readarray来避免分词问题(防止带空格的内容被拆分成多个元素):

var="[a1] [b1] [123] [Text text] [0x0]"
# 用grep匹配所有[]内的内容,再用readarray逐行读取到数组
readarray -t arr < <(grep -oP '(?<=\[)[^\]]+(?=\])' <<< "$var")

# 验证数组
echo "${arr[3]}"  # 会输出 "Text text"

这里的grep -oP表示用Perl兼容正则,(?<=\[)是正向预查(确保前面是[),[^\]]+匹配所有非]的字符,(?=\])是正向预查(确保后面是]),-o只输出匹配到的内容,每一项单独一行。readarray -t会把每一行作为数组的一个元素,完美保留空格。

方法三:用awk + readarray

awk也是个好选择,通过分隔符拆分字符串后提取目标内容:

var="[a1] [b1] [123] [Text text] [0x0]"
# 用[]作为分隔符,提取偶数位置的字段(因为分隔后奇数位是空或者],偶数位是我们要的内容)
readarray -t arr < <(awk -F '[][]' '{for(i=2;i<=NF;i+=2) print $i}' <<< "$var")

# 查看数组内容
declare -p arr

运行declare -p arr会输出数组的完整结构,能看到每个元素都正确保留了空格。

内容的提问来源于stack exchange,提问作者suf noK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:45:05