如何从Bash变量中筛选指定正则匹配内容并存入数组
解决Bash中提取指定成对短语到数组的问题
问题回顾
你定义了变量:
users_="a1 .localhost a2 a3 .localhost a4"
需要提取所有以a开头加数字且后续紧跟.localhost的成对短语,最终存入Bash数组,预期结果:
"a1 .localhost" "a3 .localhost"
之前命令的错误原因
你执行的$users_ | grep '^a[0-9]+\s\.localhost$'有两个问题:
- 直接调用
$users_会把变量中的第一个元素a1当作命令执行,导致报错,必须用echo或printf输出变量内容后再管道。 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
相关产品推荐
相关产品推荐

