Una linhas de padrão e linhas consecutivas não vazias, separadas por vírgulas e entre ()

2

Eu tenho um arquivo que tem

click
css_add_violation_false

click
css_add_claim_false

e

select
css_driver1_birth_date_month
birth_date_month

select
css_driver1_birth_date_day
birth_date_day

Como eu poderia substituir o valor de clique [newline] com o click (value)?
ou clique no valor [newline] valor [newline] com o clique (valor, valor)

Eu não consegui descobrir com sed provavelmente porque não é bom para material com várias linhas.

Eu tentei usar tr para remover o retorno de carro com

tr 'select\n' 'select('

mas isso removeu todos os retornos de carro e adicionou lotes de (

(nota: osx)

Saída desejada:

click(css_add_violation_false)
click(css_add_claim_false)

e

select(css_driver1_birth_date_month, birth_date_month)
select(css_driver1_birth_date_day, birth_date_day

Será uma resposta bem mais genérica se conseguir lidar com qualquer número de parâmetros até que uma linha em branco seja vista.

    
por Michael Durrant 18.08.2015 / 13:54

3 respostas

3

com awk :

awk '{if($0=="click"){getline n;printf "%s(%s)\n", $0, n}else{print}}' file

Se a linha corresponder a click , carregue a próxima linha em uma variável chamada n e imprima o formato de saída desejado.

Editar:

Se houver um número variável de várias linhas e você quiser combiná-las até que a linha vazia ocorra, use isto:

awk '{if($0=="click"){getline n; printf "%s(%s", $0, n;
  while($0!=""){printf ",%s", $0; getline};
  printf ")\n\n", x}else{print}}' file

Imprime as linhas separadas por vírgulas, até encontrar uma linha vazia.

    
por 18.08.2015 / 14:07
0

perl é uma boa ferramenta para este trabalho:

$ perl -p00e 's/click\n(.*)\n/click()\n/' file
click(css_add_violation_false)

click(css_add_claim_false)
    
por 18.08.2015 / 14:03
0

Para o GNU sed

sed -Ez 's/(click)\n([^\n]*)/()/g'

ou estilo antigo

sed '/click/{N;s/\n/(/;s/$/)/;}'
    
por 18.08.2015 / 14:25