sed: combina duas linhas

11

Eu tenho um arquivo de texto, onde os registros são divididos em duas linhas. Eu gostaria de colocá-los em uma linha. Os registros são mais ou menos assim:

2013-07-29
 apt-get install git
2013-07-29
 apt-get install rsync
2013-07-31
 apt-get install nmap
2013-08-02
 apt-get install cifs-utils
2013-08-05
 apt-get install telnet

Gostaria de obter o seguinte:

2013-07-29 apt-get install git
2013-07-29 apt-get install rsync
2013-07-31 apt-get install nmap
2013-08-02 apt-get install cifs-utils
2013-08-05 apt-get install telnet

Eu tentei com sed, mas não consigo combinar duas linhas. Existe algum truque sedou alguma ferramenta melhor?

Martin Vegter
fonte
Parece menos que você deseja combinar duas linhas e mais quer ingressar na linha depois de encontrar uma correspondência. Sim?
Kurtm

Respostas:

13
sed 'N;s/\n/ /'
  • N une a próxima linha de entrada ao espaço do padrão
  • s/\n/ / substitui a nova linha que separa as linhas por um espaço.

ou:

sed -n 'N;s/\n/ /;/regex/p'
  • -n desativa a impressão automática do espaço do padrão como último comando
  • /regex/p imprime linhas correspondentes a regex

Use o gmodificador para as substituições, caso esteja juntando mais de duas linhas, por exemplo N;N;N;s/\n/ /g.

peterph
fonte
lembre-se: sed funciona em linhas! eu passei anos tentando sed 's/>\n</>,</'trabalhar até perceber que o sed funciona nas linhas de cada vez. uma rápida pesquisa duckduckgo e @peterph me permitiram manter o resto do meu cabelo
northern-bradley
6

Parece que as apt-getlinhas têm um espaço em branco anterior. Dizendo:

sed -e :a -e '$!N;s/\n / /;ta' -e 'P;D' inputfile

deve produzir o resultado desejado.

Como alternativa, você também pode usar paste:

paste -d' ' - - < inputfile
devnull
fonte