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?


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.