sed: combina duas linhas

8

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 parecem com algo 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 corresponder a duas linhas. Existe algum truque em sed , ou existe alguma ferramenta melhor?

    
por Martin Vegter 07.10.2013 / 13:14

2 respostas

12
sed 'N;s/\n/ /'
  • N associa a próxima linha de entrada ao espaço 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 padrão como último comando
  • /regex/p imprime linhas correspondentes a regex

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

    
por 07.10.2013 / 13:20
6

Parece que as linhas apt-get têm um espaço em branco precedente. 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
    
por 07.10.2013 / 13:22