用sed或awk移除if及其块
我试图使用sed从构建文件中删除一个条件块,但到目前为止还没有成功 我要删除的块是每次出现“if(!isFoss()){…}” 这是我正在研究的一个文本示例:用sed或awk移除if及其块,awk,sed,Awk,Sed,我试图使用sed从构建文件中删除一个条件块,但到目前为止还没有成功 我要删除的块是每次出现“if(!isFoss()){…}” 这是我正在研究的一个文本示例: repositories { google() if (!isFoss()) { maven { url 'https://maven.fabric.io/public' } } if (!isFoss()) { something {
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声明中的问题是可靠的。这很有效。我认为它可以很容易地推广给未来的用户,让他们找到这个答案