如果找到模式,请删除花括号块

如果找到模式,请删除花括号块

{}如果在块内找到模式,我想删除花括号块+它的“名称”(2个单词前缀)。
我尝试了一些sed魔法,但没能成功。
例如:

  • 图案:图案 图案-X

输入

m m1 {  
    s s1;  
    s s2;  
    c c1 {  
        s s3;   
        c c2 {  
            PATTERN PATTERN-X  
            ...  
        }  
        s s4;
    }  
    c c3 {  
        PATTERN PATTERN-X  
        ...
        c c4 {
            s s4;
        }
    }  
}

输出

m m1 {  
    s s1;  
    s s2;  
    c c1 {  
        s s3;   
        s s4;
    }  
}

答案1

你可以试试这个 awk

awk '
$0~/{/{
  if(b) {
    print b
  b=""
  }
  if(c)
    c++
}
$0~/PATTERN/ {
  b=""
  c=2
}
$0~/}/ {
  if(c)
    c--
}
!c {
  if(b)
    b=b RS
  b=b $0
}
END {
  print b
}
' infile

答案2

通常解析任何函数式语言都不是一个好主意,这个例子看起来就是这样。解析工具旨在处理正则表达式工作正常的人类语言。话虽这么说……我们仍然可以尝试。

这是我使用的方法pcregrep

pcregrep -Mv '.*{.*\n.*PATTERN(([^{}]|\n)*|([^{}]|\n)*{([^{}]|\n)*}.*([^{}]|\n)*)}.*' file

与您的示例配合良好,即{}后的零或一个块深度PATTERN。如果您有多个块,只需扩展它以满足您的需求。

输出:

m m1 {  
    s s1;  
    s s2;  
    c c1 {  
        s s3;   
    }  
}

相关内容