Eu tenho um arquivo de 1 linha que tem um formato de:
{port1 dev1 M1 s} {port1 dev1 M1 s} {port3 dev2 M1 g} {port1 dev1 M1 d} {port1 dev1 M3 g} ...
Eu quero dividir esta linha e cat para gerar a base do arquivo na chave { } assim. Como faço isso ?
port1 dev1 M1 s
port1 dev1 M1 s
port3 dev2 M1 g
port1 dev1 M1 d
port1 dev1 M3 g
Com perl:
Ou usando sed:
Com GNU
grep
construído com suporte a PCRE:Ou para as sequências de não-{} incluindo pelo menos um não-espaço:
Com
pcregrep
:Se
{...}
s pode ser aninhado (mas balanceado):Em uma entrada como:
Dá:
Isso primeiro substitui cada
}
um por uma nova linha usandotr
. Isso dá aosed
comando linhas individuais para trabalhar, onde cada linha começará com um espaço possível e um arquivo{
. Esses caracteres são removidos do início da linha pelosed
comando.A mesma coisa com apenas
sed
:O
y
comando funciona comotr
neste exemplo.Usando GNU
awk
oumawk
, mas não BSDawk
:Isso interpreta os dados como registros separados por
{
ou}
e, em seguida, imprime cada registro que contém algo diferente de apenas tabulações ou espaços.Usando Perl:
Isso aplica um
print
comando a cada elemento retornado pela correspondência da expressão regular fornecida com a entrada. Oprint
comando também acrescenta uma nova linha a cada elemento para obtê-los em linhas individuais.Uma solução com GNU sed:
Solução com
sed
+tr
.Usando grep + tr:
Usando sed:
Isso pode ser feito usando "sed" como mostrado:
onde o combo P;D configura um loop implícito e durante o corpo do loop nos certificamos de imprimir campos não vazios.
Em linhas semelhantes:
onde dividimos o registro, filtramos os campos não vazios e os imprimimos uma/linha em um loop for.
Com festa
Com
tr
: