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

使用Bash/sed删除test块内跨多行的visibility声明代码段

解决方案

你原来的脚本失效是因为sed默认按单行处理,正则匹配默认不会跨换行符,所以无法命中跨多行的visibility声明段。使用awk实现逻辑更直观,可完美适配单行、多行两种场景,完整修改后的脚本如下:

#!/bin/bash
#remove_lines.sh
remove_visibility_lines () {
    awk '
    /^test\(/ { in_test = 1 }
    in_test && /^[[:space:]]*visibility = \[/ {
        del_mode = 1
        # 匹配单行visibility的情况,直接关闭删除模式
        if ($0 ~ /\][[:space:]]*,?[[:space:]]*$/) {
            del_mode = 0
        }
        next
    }
    del_mode {
        # 匹配到visibility数组闭合标记,关闭删除模式
        if ($0 ~ /\][[:space:]]*,?[[:space:]]*$/) {
            del_mode = 0
        }
        next
    }
    /^\)/ && in_test { in_test = 0 }
    # 非删除状态的行正常输出
    1
    ' "$1"
}

remove_visibility_lines "$1"

实现逻辑说明

  • 用in_test变量标记当前行是否处于test(...)块范围内
  • 用del_mode变量标记当前是否处于需要删除的visibility代码段范围内
  • 进入test块后如果匹配到visibility定义起始,就开启删除模式,直到匹配到]闭合标记才关闭删除模式,中间所有行都跳过输出
  • 不在test块内的所有内容会原样输出,不会影响etc等其他块的visibility声明

运行上述脚本处理你提供的输入示例,输出完全符合预期要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:24:03