sed: unir dos líneas

11

Tengo un archivo de texto, donde los registros se dividen en dos líneas. Me gustaría ponerlos en una línea. Los registros se parecen a esto:

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

Me gustaría obtener lo siguiente:

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

Lo intenté con sed, pero no puedo hacer coincidir dos líneas. ¿Hay algún truco sedo hay alguna herramienta mejor?

Martin Vegter
fuente
Parece menos que desea hacer coincidir dos líneas, y más desea unirse a la línea después de encontrar una coincidencia. ¿Si?
kurtm

Respuestas:

13
sed 'N;s/\n/ /'
  • N une la siguiente línea de entrada al espacio del patrón
  • s/\n/ / reemplaza la nueva línea que separa las líneas con un espacio.

o:

sed -n 'N;s/\n/ /;/regex/p'
  • -n deshabilita la impresión automática del espacio del patrón como último comando
  • /regex/p imprime líneas que coinciden con expresiones regulares

Use el gmodificador para las sustituciones en caso de que esté uniendo más de dos líneas, por ejemplo N;N;N;s/\n/ /g.

Peterph
fuente
punto para recordar: ¡sed funciona en líneas! Pasé años tratando de llegar sed 's/>\n</>,</'al trabajo hasta que me di cuenta de que sed funciona en líneas a la vez. una búsqueda rápida de duckduckgo y @peterph me permitieron mantener el resto de mi cabello
northern-bradley
6

Parece que las apt-getlíneas tienen un espacio en blanco precedente. Diciendo:

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

debería producir el resultado deseado.

Alternativamente, también puedes usar paste:

paste -d' ' - - < inputfile
devnull
fuente