Você pode tentar este 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
Eu gostaria de remover chaves {}
block + seu "nome" (prefixo de 2 palavras), se um padrão for encontrado dentro do bloco.
Eu tentei alguns sed
magic mas não consegui.
Por exemplo:
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;
}
}
Normalmente, não é boa ideia analisar qualquer linguagem funcional e este exemplo se parece com isso. As ferramentas de análise foram projetadas para lidar com linguagem humana em que a expressão regular funciona bem. Com isso dito ... ainda podemos tentar.
Aqui está minha abordagem usando pcregrep
:
pcregrep -Mv '.*{.*\n.*PATTERN(([^{}]|\n)*|([^{}]|\n)*{([^{}]|\n)*}.*([^{}]|\n)*)}.*' file
Funciona bem com seu exemplo, ou seja, zero ou um bloco {}
profundidade após PATTERN
. Se você tiver mais de um bloco, estenda isso para atender às suas necessidades.
Saída:
m m1 {
s s1;
s s2;
c c1 {
s s3;
}
}
Tags text-processing awk sed