Uma abordagem Perl:
$ perl -F"" -a00ne 'for (@F){$i++ if /{/; $i||print; $i-- if /}/}' file
This is
that wants
anyway
Explicação
-a
: ativa a divisão automática no delimitador de arquivo fornecido por -F
na @F
matriz.
-F""
: define o separador do campo de entrada como vazio, o que resultará em cada elemento @F
como um dos caracteres de entrada.
-00
: ativa o "modo de parágrafo", onde uma "linha" é definida como dois caracteres consecutivos de nova linha. Isso significa que o arquivo inteiro nesse caso será tratado como uma única linha. Se o seu arquivo pode ter muitos parágrafos e os colchetes podem abranger vários parágrafos, use-o -0777
.
-ne
: leia um arquivo de entrada e aplique o script fornecido por -e
cada linha.
O script em si é realmente bastante simples. Um contador é incrementado em um toda vez que a {
é visto e decrementado em um para cada }
. Isso significa que quando o contador é 0, não estamos entre colchetes e devemos imprimir:
for (@F){}
: faça isso para cada elemento de @F
, cada caractere na linha.
$i++ if /{/;
: incrementa $i
em um se esse caractere for um{
$i||print;
: imprime a menos que $i
esteja definido (0 conta como não definido).
$i-- if /}/
: decrementa $i
por um se esse caractere for um}