用sed或awk删除if及其块

Leo*_*rra 1 awk sed

我正在尝试使用sed从构建文件中删除条件块,但到目前为止它没有用。

我要删除的块是每次出现的“ if(!isFoss()){...}”。

这是我正在处理的文本示例:

repositories {
   google()
   if (!isFoss()) {
      maven {
         url 'https://maven.fabric.io/public'
         }
   }

   if (!isFoss()) {
      something {
         url 'https://anotherurl.test/public'
         }
   }

}
Run Code Online (Sandbox Code Playgroud)

所需的输出是:

repositories {
   google()
}
Run Code Online (Sandbox Code Playgroud)

我尝试过

sed '/!isFoss()/!b;:A;N;;/\n}/!{s/\n.*//;bA}'
Run Code Online (Sandbox Code Playgroud)

但它的行为不可靠(通常会留下条件或最后一个括号)。

ste*_*fen 5

我不认为,这是一种简单的方法,因为您需要解析输出。但是,如果您在编写这些“存储库文件”时非常严格,则可能会有所帮助:

$ awk 'd==0{m=0} /!isFoss()/{m=1} m==1&&/{/{d++} d==0{print} m==1&&/}/{d--}' file
repositories {
   google()


}
Run Code Online (Sandbox Code Playgroud)

m是一个标志,表明您已找到匹配项。d在上递增{和递减}。不过,您必须查看所有更改。

  • +1表示方括号,-1表示难读的脚本。恕我直言,一个班轮很难胜任这份工作,因为一个人也想解决一些特殊情况(例如,如果我很邪恶并且在注释行中添加了{{和/或`}`怎么办?)(例如,如果括号在换行符“ if()”语句处?)。来自OP声明下@Ed Morton的问题是可靠的。 (3认同)
  • 我试图用“您必须解析”,“如果您非常严格”和“您必须查看所有更改”来覆盖这种情况(还有““}”“,也就是字符串文字)。 (2认同)