在Bash中定位Terraform的pipeline_schedules数组闭合括号行号
查找Terraform数组闭合括号的行号(处理嵌套子数组)
问题场景
已知Terraform脚本中pipeline_schedules数组的起始行号,需要定位该数组最外层闭合括号]所在的行号——由于数组内部存在variables = []这类嵌套子数组,常规字符串匹配方法无法准确识别外层闭合位置。
解决方案:基于括号计数的Bash脚本
利用括号计数逻辑,从起始行开始逐行统计左括号[和右括号]的数量,当两者计数相等时,当前行即为外层数组的闭合行。这种方法会自动抵消嵌套子数组的括号影响。
基础版本脚本
假设起始行号为START_LINE,目标Terraform文件为tf_file.tf,脚本如下:
#!/bin/bash # 替换为实际的起始行号 START_LINE=1 # 替换为你的Terraform文件路径 TF_FILE="your_terraform_file.tf" awk -v start="$START_LINE" ' NR >= start { # 统计当前行的左、右括号数量并累加 left_count += gsub(/\[/, "") right_count += gsub(/\]/, "") # 左右括号数量平衡时,输出行号并退出 if (left_count == right_count) { print NR exit } }' "$TF_FILE"
处理注释的增强版本
如果Terraform文件中存在包含括号的注释(比如# 示例]),需要先过滤行内注释避免干扰计数:
#!/bin/bash START_LINE=1 TF_FILE="your_terraform_file.tf" awk -v start="$START_LINE" ' NR >= start { # 移除行内所有#及后面的注释内容 sub(/#.*/, "") left_count += gsub(/\[/, "") right_count += gsub(/\]/, "") if (left_count == right_count) { print NR exit } }' "$TF_FILE"
工作原理
- 从指定起始行开始逐行处理文件内容
- 每一行统计并累加
[和]的出现次数 - 嵌套子数组的
[]会让左右计数同时增加,不会打破外层的平衡 - 当左右计数相等时,说明找到最外层数组的闭合括号,输出当前行号后终止程序
内容的提问来源于stack exchange,提问作者joe1531
相关产品推荐
相关产品推荐

