如何在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
相关产品推荐
相关产品推荐

