Sed 打印文本出现后方括号中的项目
Sed print the items in square brackets that's after the occurence of a text
我有以下情况:
- 场景 1
foo_bar = ["123", "456", "789"]
- 场景 2
foo_bar = [
"123",
"456",
"789"
]
- 场景 3
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:]]*
中,在第二个非常长的正则表达式中。我不会编辑它,但它不重要,也不一致 - 我不允许在其他模式的行尾有任何尾随空格。
我有以下情况:
- 场景 1
foo_bar = ["123", "456", "789"]
- 场景 2
foo_bar = [
"123",
"456",
"789"
]
- 场景 3
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:]]*
中,在第二个非常长的正则表达式中。我不会编辑它,但它不重要,也不一致 - 我不允许在其他模式的行尾有任何尾随空格。