【问题标题】:Removing delimited block of code between patterns using bash (regex, sed)使用 bash (regex, sed) 删除模式之间的分隔代码块
【发布时间】: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)。

标签: awk sed


【解决方案1】:

使用awk,假设没有嵌套() 字符:

awk '/^test\(/{f=1} $0==")"{f=0}
     f && /visibility = \[/{v=1} !v; /],/{v=0}' ip.txt
  • /^test\(/{f=1} 设置标志 f 如果一行以 test( 开头
  • $0==")"{f=0} 清除标志 f 如果一行仅包含 )
  • f && /visibility = \[/{v=1} 设置标志 v 如果还设置了 f 并且一行包含 visibility = [
  • !v; 仅在未设置标志 v 时打印输入行
  • /],/{v=0} 清除标志 v 如果行包含 ],

传递开始和结束字符串:

$ cat script.awk
index($0, start) == 1 { f = 1 }
$0 == end { f = 0 }
f && /visibility = \[/ { v = 1 }
! v { print }
/],/ { v = 0 }

$ awk -v start='test(' -v end=')' -f script.awk ip.txt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 2017-01-04
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多