Sed 打印文本出现后方括号中的项目

Sed print the items in square brackets that's after the occurence of a text

我有以下情况:

foo_bar = ["123", "456", "789"]
foo_bar = [
    "123", 
    "456", 
    "789"
]
variable "foo_bar" {
  type    = list(string)
  default = ["123", "456", "789"]
}

所以我想弄清楚如何使用 sed 括号内 foo_bar accounting scenario 2 下的项目进行打印,这是一个多行

所以这里的匹配结果是

场景 1

"123", "456", "789"

场景 2

 "123", 
 "456", 
 "789"

场景 3

"123", "456", "789"

not_foo_bar = [
    "123", 
    "456", 
    "789"
]

这应该匹配,只匹配foo_bar

这是我目前尝试过的方法

sed -e '1,/foo_bar/d' -e '/]/,$d' test.tf

还有这个

sed -n 's/.*\foo_bar\(.*\)\].*//p' test.tf

这可能适合您 (GNU sed):

sed -En '/foo_bar/{:a;/.*\[([^]]*)\].*/!{N;ba};s///p}' file

关闭隐式打印并启用扩展正则表达式 -nE

foo_bar 上进行模式匹配,然后收集下一个 [] 之间的行并打印结果。

虽然有点啰嗦,但是 POSIX sed 并且有效。

sed -Ene \
'# scenario 1
s/(([^[:alnum:]_]|^)foo_bar[^[:alnum:]_][[:space:]]*=[[:space:]]*\[)([^]]+)(\]$)//p

# scenario 2 and 3
 /([^[:alnum:]_]|^)foo_bar[^[:alnum:]_][[:space:]]*=?[[:space:]]*[[{][[:space:]]*$/,/^[]}]$/ {
    //!p
    s/(([^[:alnum:]_]|^)default[^[:alnum:]_][[:space:]]*=[[:space:]]*\[)([^]]+)(\]$)//p
}' |

# filter out unwanted lines from scenario 3 ("type =")
sed -n '/^[[:space:]]*"/p'

我没法一口气看完所有内容 sed

第一个sed的第一行和最后一行是相同的命令(使用default而不是foobar)。

编辑:为了防止有人感到困惑,我错误地留在了最后一个 [[:space:]]* 中,在第二个非常长的正则表达式中。我不会编辑它,但它不重要,也不一致 - 我不允许在其他模式的行尾有任何尾随空格。