A questão foi editada para incluir dados em um formato totalmente diferente. A resposta original está abaixo da linha, e as partes relativas a sed
em geral ainda se aplicam.
sed
pode reescrever linhas em outros formatos . Aqui está um rápido comando sed
para fornecer uma linha CSV por registro para esses novos dados:
sed -n -e '/secs:/{s/.*secs://;H;};/position:/{s/^.*position: \[\([^]]*\)\]//;G;s/\n\+/,/gp}'
Isso usa o espaço reservado . Por outro lado, o que você realmente quer aqui é um YAML parser ; só porque podemos fazer isso com sed
ou outras ferramentas, não significa que devemos fazê-lo.
Para fazer uma substituição e um grep ao mesmo tempo com sed
, você pode usar -n
e p
:
sed -n -e 's/foo/bar/p'
Quanto à leitura de dados, desde que seja streaming, você pode usar os pipelines de shell para fazer isso:
yourcommand | sed -e '...'
Isso coloca a saída de yourcommand
diretamente na entrada de sed
, onde ele pode processar os campos de vetor para você como acima. Quando yourcommand
termina, o pipeline também.
Para redirecionar a saída sed
para um arquivo, também é possível usar o redirecionamento de saída :
yourcommand | sed -e '...' > vectors.csv
Isso criará um arquivo CSV chamado vectors.csv
com a saída do comando sed
.
Dado um arquivo data
em seu formato (original):
time position t x: [0.1 1]
time position t x: [0.2 2]
time position t x: [0.3 3]
você pode executar:
sed -e 's/.*\[\([^]]*\)\].*//' data
e obtenha a saída do formulário:
0.1 1
0.2 2
0.3 3
Você pode querer isso separado por vírgula, para que possamos fazer isso também:
sed -e 's/.*\[\([^ ]*\) \([^]]*\)\].*/,/' < data
0.1,1
0.2,2
0.3,3
sed
fornece uma linguagem de programação para reescrever linhas, e estamos usando o comando s
para fazer uma substituição de string no expressão regular que descreve toda a linha.
O padrão é entre o primeiro e o segundo /
caracteres. Temos .*
do lado de fora, para combinar com o resto da linha (que vamos jogar fora, mas precisamos nos endereçar em algum lugar).
Combinamos [
e ]
como as bordas daquilo que nos interessam e os dois números dentro delas. Como a sintaxe da expressão regular também usa []
para significar algo, colocamos barras invertidas antes das que queremos literalmente. Essas estão dentro do .*
s.
Entre \( \)
, estamos capturando o texto que combinamos lá. Nesse caso, o texto é descrito pela expressão [^ ]*
, que significa muitos caracteres, exceto um espaço. Então, combinamos um espaço literal com seus dados, seguido por outro grupo de captura. O segundo grupo corresponde a [^]]*
, o que significa muitos caracteres, exceto ]
. Finalmente, combinamos a terminação ]
com \]
.
A parte entre o segundo e o terceiro /
é a sequência de substituição e podemos nos referir aos nossos dois grupos capturados como e
:
torna-se
0.1
e torna-se
1
para a primeira linha, por exemplo. Quaisquer outros caracteres são incluídos literalmente na saída, então a vírgula de separação aparece entre eles.