Sed para mesclar linhas delimitadas com um token [duplicado]

2

Estou tentando escrever um script que use sed para processar linhas em um arquivo de texto para gerar uma documentação de exemplo. Eu tenho a maior parte do roteiro funcionando, mas estou preso a um caso extremo. Considere o seguinte arquivo

line-1
line-2, part2
line-3-should-be-a-very-long,
    line-3-continued
line-4

O problema é que algumas linhas, mas não todas, terminam em um token especial (acontece de ser uma vírgula). O token indica que a linha deve ser concatenada com a seguinte para produzir uma linha longa.

Portanto, no meu exemplo line-3-should-be-a-very-long, deve ser concatenado com line-3-continued para me dar line-3-should-be-a-very-long, line-3-continued (eu quero manter a vírgula). Não há nenhuma ação especial na linha 2, embora contenha uma vírgula que NÃO esteja no final da linha.

O restante do processamento é feito com a canalização de alguns comandos sed e grep juntos, para que uma solução sed seja adequada.

    
por Stormcloud 20.04.2018 / 15:18

2 respostas

5
$ sed '/,$/{N;s/\n//;}' file
line-1
line-2
line-3-should-be-a-very-long,    line-3-continued
line-4

Se os espaços em branco devem ser excluídos:

$ sed '/,$/{N;s/\n[[:blank:]]*//;}' file
line-1
line-2
line-3-should-be-a-very-long,line-3-continued
line-4

(se você quiser que um único espaço permaneça entre as linhas, substitua // no código por / / )

Se as linhas puderem ser continuadas várias vezes, como em

line-1
line-2
line-3-should-be-a-very-long,
    line-3-continued,
        line-3-continued-further
line-4

então,

$ sed '/,$/{:loop;N;s/\n[[:blank:]]*//;/,$/bloop;}' file
line-1
line-2
line-3-should-be-a-very-long,line-3-continued,line-3-continued-further
line-4

Este último script sed foi explicado com anotações:

/,$/{                     # if the current line ends with a comma, then...
    :loop                 # define label "loop"
    N                     # append next line from input (a newline will be inserted in-between)
    s/\n[[:blank:]]*//    # delete that newline and any blanks (tabs or spaces) directly after it
    /,$/bloop             # if the line now ends with comma, branch to the "loop" label
}
# implicit output of (possibly) modified line at end
    
por 20.04.2018 / 16:04
0
sed '/,$/{N;s/\n[[:blank:]]\+/ /}' file

Quando você vir uma linha que termina com uma vírgula, leia a próxima linha e substitua a nova linha e o espaço em branco inicial da próxima linha por um único espaço.

    
por 20.04.2018 / 15:37

Tags