如何使用sed提取foo_bar对应方括号内的内容(支持多行场景)
正确sed命令及使用说明
直接给出符合需求的可用命令:
sed -n '/\<foo_bar\>.*\[/{:a;N;/]/!ba;s/.*\[//;s/\].*//p}' test.tf
命令逻辑拆解
/\<foo_bar\>.*\[:精确匹配包含独立单词foo_bar且后方带有[的行,避免误匹配not_foo_bar这类相似命名的变量:a;N;/]/!ba:定义循环标记a,不断将下一行内容追加到当前模式空间,直到匹配到闭合的]为止,解决多行数组的提取问题s/.*\[//:删除模式空间中从开头到第一个[的所有内容s/\].*//:删除模式空间中从第一个]到结尾的所有内容p:打印处理后剩余的方括号内部内容
原有命令问题说明
- 第一种
sed -e '1,/foo_bar/d' -e '/]/,$d'的问题是会从文件开头删到第一个foo_bar的位置,若foo_bar不是第一个匹配项会误删内容,且无法处理foo_bar行内同时包含[和]的场景 - 第二种
sed -n 's/.*\foo_bar\(.*\)\].*/\1/p'仅支持单行匹配,无法处理多行数组场景,且\foo_bar的写法有误,也没有做精确单词匹配,容易误匹配相似命名变量
效果验证
该命令可完全匹配你给出的三个场景输出要求:
- 场景1单行数组:直接输出方括号内的
"123", "456", "789" - 场景2多行数组:保留原有的换行和缩进格式,输出对应多行内容
- 场景3Terraform变量块:仅提取
foo_bar的default数组内的内容,忽略其他字段内容
注意事项
该命令适用于无嵌套方括号的一维数组场景,符合你给出的所有测试用例需求。如果存在嵌套数组场景,建议使用专门的结构化配置解析工具处理会更稳妥。
内容的提问来源于stack exchange,提问作者edmamerto
相关产品推荐
相关产品推荐

