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?


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.