使用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
相关产品推荐
相关产品推荐

