【发布时间】:2021-09-15 14:49:57
【问题描述】:
我有一个包含visibility 声明的文件,跨越一行或多行,如果它们位于test 块中,我希望将其删除仅。
即输入.txt:
test(
srcs = [
"test1",
],
visibility = [
"common",
],
deps = [ "deps" ],
)
test(
srcs = [
"test2",
],
visibility = [ "common" ],
)
即输出:
test(
srcs = [
"test1",
],
deps = [ "deps" ],
)
test(
srcs = [
"test2",
],
)
可见性线可能在其他块内,即etc(...),在这种情况下,它们不应被删除。即:
etc(
src = [
"etc",
],
# should not be removed because it's not inside a test(...) block
visibility = [
"common",
],
)
这是我尝试过的,但是,这只匹配跨越单行的 visibility 块:
#!/bin/bash
#remove_lines.sh
remove_visibility_lines () {
start_pattern="test"
end_pattern=")"
pattern_to_remove="visibility = \[.*\],"
sed "/${start_pattern}/,/${end_pattern}/{/${pattern_to_remove}/d}" "$1"
}
remove_visibility_lines $1
$ ./remove_lines.sh input.txt
我尝试了几种方法来消除跨越多个块的可见性,即(.*?) 和(\_.*),但我似乎无法让它工作。
请帮忙?
问题类似于:
Using sed to delete all lines between two matching patterns 但是,就我而言,我的模式嵌套在模式中。即:您只查看test(...) 块内部,并且仅在这些块内部删除visibility = [...], 块。
【问题讨论】:
-
(.*?)在 sed 和 awk 中是未定义的行为,我怀疑它可能意味着 perl 但 idk 中的某些东西。请用谷歌搜索 BRE(所有 sed 变体默认使用)、ERE(awk 和 GNU 或 BSD sed)和 PCRE(perl)。