Remover o conjunto de chaves se o padrão for encontrado

3

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:

  • Padrão: PATTERN PATTERN-X

Entrada

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;
        }
    }  
}

Saída

m m1 {  
    s s1;  
    s s2;  
    c c1 {  
        s s3;   
        s s4;
    }  
}
    
por hudac 29.12.2017 / 20:21

2 respostas

1

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
    
por 30.12.2017 / 01:55
1

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;   
    }  
}
    
por 29.12.2017 / 22:21