Combine linhas sempre que a string corresponder no arquivo

0

Gostaria de combinar duas linhas sempre que a string específica fosse encontrada no arquivo.

Entrada de amostra:

{
    id: 23281598
      total: {
        value: 3.0
      }
      isThin: false
      raw: {
        value: 6.0
      }
    }
    total: {
      value: 1.401326182E9
    }
    Pools: {
      value: 8.98886247E8

Saída desejada:

{
    id: 23281598
      total: { value: 3.0
      }
      isThin: false
      raw: { value: 6.0
      }
    }
    total: { value: 1.401326182E9
    }
    Pools: { value: 8.98886247E8

Como você percebe, sempre que eu encontrar o padrão value: , quero combiná-lo com a linha anterior no arquivo. Estou bem se você remover os espaços em branco iniciais em cada linha. Eu preciso de awk ou sed solution. Não há nenhum padrão fixo no arquivo de entrada. A linha contendo value: pode ocorrer em qualquer lugar, mas não ocorrerá consecutivamente.

Usando o Solaris 5.10.

    
por ayrton_senna 01.03.2018 / 03:01

3 respostas

1

POSIXLY:

LC_ALL=C sed -e '$!N;/value:/b1' -e 'P;D' -e:1 -e 's/\n[[:space:]]*/ /' <file

É direto:

  • $!N : com cada linha, exceto a última, lendo a próxima linha
  • /value:/b1 : se o padrão corresponder, vá para a filial denominada 1
  • P;D : se o padrão não corresponder, imprima a linha atual, inicie um novo ciclo com a linha de leitura de $!N acima. Portanto, se você tiver line1\nline2 , imprima line1 , inicie um novo ciclo com line2 , $!N faça com que seja line2\nline3 e assim por diante.
  • :1 : define a ramificação denominada 1
  • 's/\n[[:space:]]*/ /' : no ramo 1 , substitua a nova linha incorporada e os espaços iniciais por um espaço.
por 01.03.2018 / 03:34
1

Mantenha a simplicidade:

sed 'N;s/\n[[:space:]]*value:/ value:/;P;D'

Faça um ciclo N;P;D para processar sempre duas linhas de uma vez (não é necessário $! aqui, btw). Dentro de substituir uma nova linha com espaços seguidos por value: com um único espaço em branco. É isso.

    
por 01.03.2018 / 18:08
0

Você pode tentar usar sed também

sed -e '/: {$/{N;s/\n//g}' -e 's/{.*v/{ v/g' file

Explicação:

  • / condição inicial
  • : {$ se a linha terminar com : {
  • / condição final
  • { Iniciar grupo de operações
  • N; concatena a linha abaixo para a linha correspondente
  • s/\n//g faz a substituição de \n
  • } End operation group

Opcional para formatação de saída

  • 's/{.*v/{ v/g' executam outra expressão onde substituem todos entre { & v (espaços) para um único espaço

Meu entendimento não é compatível com a opção -i , portanto você deve fazer um redirecionamento da saída para fazer as alterações.

Dê uma chance

    
por 01.03.2018 / 04:17