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

如何从Bash变量中筛选指定正则匹配内容并存入数组

解决Bash中提取指定成对短语到数组的问题

问题回顾

你定义了变量:

users_="a1 .localhost a2 a3 .localhost a4"

需要提取所有以a开头加数字且后续紧跟.localhost的成对短语,最终存入Bash数组,预期结果:

"a1 .localhost"
"a3 .localhost"

之前命令的错误原因

你执行的$users_ | grep '^a[0-9]+\s\.localhost$'有两个问题:

  1. 直接调用$users_会把变量中的第一个元素a1当作命令执行,导致报错,必须用echo或printf输出变量内容后再管道。
  2. grep默认使用基础正则,+需要转义为\+;且原变量是单行内容,^和$会匹配整行,无法单独提取成对短语。

两种可行实现方法

方法一:Bash原生循环处理

直接利用Bash数组和循环,逻辑清晰:

# 定义原始变量
users_="a1 .localhost a2 a3 .localhost a4"
# 将变量拆分为按空格分隔的数组
arr=($users_)
# 初始化结果数组
result=()

# 步长为2遍历数组,每次检查一对元素
for ((i=0; i<${#arr[@]}; i+=2)); do
    # 验证当前元素是否符合a+数字格式,且下一个元素是.localhost
    if [[ ${arr[i]} =~ ^a[0-9]+$ && ${arr[i+1]} == ".localhost" ]]; then
        # 将符合条件的成对短语加入结果数组
        result+=("${arr[i]} ${arr[i+1]}")
    fi
done

# 输出验证结果
printf "%s\n" "${result[@]}"

方法二:用awk批量处理

适合处理复杂文本场景,一行命令即可完成:

users_="a1 .localhost a2 a3 .localhost a4"
# 用awk遍历字段,每两个字段为一组检查,输出符合条件的组合
result=($(echo "$users_" | awk '{
    for(i=1; i<=NF; i+=2) {
        if ($i ~ /^a[0-9]+$/ && $(i+1) == ".localhost") {
            print $i " " $(i+1)
        }
    }
}'))

# 输出验证结果
printf "%s\n" "${result[@]}"

结果验证

执行上述任意方法后,运行printf "%s\n" "${result[@]}"会输出:

a1 .localhost
a3 .localhost

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:52:45