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.