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

如何使用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. 场景1单行数组:直接输出方括号内的"123", "456", "789"
  2. 场景2多行数组:保留原有的换行和缩进格式,输出对应多行内容
  3. 场景3Terraform变量块:仅提取foo_bar的default数组内的内容,忽略其他字段内容

注意事项

该命令适用于无嵌套方括号的一维数组场景,符合你给出的所有测试用例需求。如果存在嵌套数组场景,建议使用专门的结构化配置解析工具处理会更稳妥。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:15:04