用sed或awk移除if及其块

用sed或awk移除if及其块,awk,sed,Awk,Sed,我试图使用sed从构建文件中删除一个条件块,但到目前为止还没有成功 我要删除的块是每次出现“if(!isFoss()){…}” 这是我正在研究的一个文本示例: repositories { google() if (!isFoss()) { maven { url 'https://maven.fabric.io/public' } } if (!isFoss()) { something {

我试图使用sed从构建文件中删除一个条件块,但到目前为止还没有成功

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

这是我正在研究的一个文本示例:

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

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

}
所需输出为:

repositories {
   google()
}
我试过了

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

但是它的行为是不可靠的(通常离开条件或最后一个括号)。

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

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


}

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

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

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


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

这可能适合您(GNU-sed):

遇到字符串
if(!isFoss()){
时,收集模式空间中的下列行,直到一行以某些空格开头,或没有空格,后跟
}
,然后删除模式空间的内容

注意:这取决于右括号与if子句的开头对齐。

这可能适用于您(GNU sed):

遇到字符串
if(!isFoss()){
时,收集模式空间中的下列行,直到一行以某些空格开头,或没有空格,后跟
}
,然后删除模式空间的内容


注意:这依赖于右括号与if子句的开头对齐。

我得到了
google…
和最后一个
isFoss
。请更新您的Q以显示
uname-srv
sed--version
。祝你好运。如果(!isFoss()){…}块中的任何{…}块中总是有并且只有1个
块吗?在
中的注释或字符串中是否可以有
}
s!isFoss()
block?
}
s是否总是在自己的一行上(空格除外)?如果结束卷曲的缩进一致,只需
sed'/isFoss/,/^}/d'
。但是如果你需要计算打开和关闭。。。呃,不是sed。@EdMorton是的,在注释中只有1
无论什么{…}
和no
}
。我尝试了steffen解决方案,似乎效果不错。我得到了
google…
和最后一个
isFoss
。请更新您的Q以显示
uname-srv
sed--version
。祝你好运。如果(!isFoss()){…}
块中的任何{…}块中总是有并且只有1个
块吗?在
中的注释或字符串中是否可以有
}
s!isFoss()
block?
}
s是否总是在自己的一行上(空格除外)?如果结束卷曲的缩进一致,只需
sed'/isFoss/,/^}/d'
。但是如果你需要计算打开和关闭。。。呃,不是sed。@EdMorton是的,在注释中只有1
无论什么{…}
和no
}
。我尝试了steffen解决方案,它似乎工作得很好。我试图用“您必须解析”、“如果您非常严格”和“您必须检查所有更改”来覆盖这种情况(还有
“}”
,所以字符串文字)。+1用于计算括号,-1用于难以阅读的脚本。一行代码很难胜任这项工作,imho,因为我们也想解决一些特殊情况(例如,如果我是邪恶的,我在注释行中添加了
{
和/或
}
)(例如,如果括号在
if()
语句的新行上怎么办?)。来自@Ed Morton在OP声明中的问题是可靠的。这很有效。我认为这对于未来的用户来说是很容易推广的,他们会发现这个答案。我试图用“您必须解析”、“如果您非常严格”和“您必须检查所有更改”来覆盖这个案例(以及
“}”
,所以字符串文字)。+1用于计算括号,-1用于难以阅读的脚本。一行代码很难胜任这项工作,imho,因为我们也想解决一些特殊情况(例如,如果我是邪恶的,我在注释行中添加了
{
和/或
}
)(例如,如果括号在
if()
语句的新行上怎么办?)。来自@Ed Morton在OP声明中的问题是可靠的。这很有效。我认为它可以很容易地推广给未来的用户,让他们找到这个答案