Respuesta rápida
sed ':a;N;$!ba;s/\n/ /g' file
- : a crear una etiqueta 'a'
- N agrega la siguiente línea al espacio del patrón
- PS si no es la última línea , ba rama (ir a) etiqueta 'a'
- S sustituto , / \ n / regex para nueva línea , / / por un espacio , / g coincidencia global (tantas veces como sea posible)
sed recorrerá los pasos 1 a 3 hasta llegar a la última línea, haciendo que todas las líneas quepan en el espacio del patrón donde sed sustituirá a todos \ n caracteres
Alternativas
Todas las alternativas, a diferencia de sed , no necesitarán llegar a la última línea para comenzar el proceso.
con golpe , lento
while read line; do printf "%s" "$line "; done < file
con perl , velocidad de sed
perl -p -e 's/\n/ /' file
con tr , más rápido que sed , puede reemplazarse por un solo carácter
tr '\n' ' ' < file
con pegar , velocidad tr- como, puede reemplazar por un solo carácter
paste -s -d ' ' file
con awk , velocidad tr- like
awk 1 ORS=' ' file
Otra alternativa como "echo $ (<archivo)" es lenta, funciona solo en archivos pequeños y necesita procesar todo el archivo para comenzar el proceso.
5.10. ¿Por qué no puedo hacer coincidir o eliminar una nueva línea usando la
secuencia de escape \ n ? ¿Por qué no puedo hacer coincidir 2 o más líneas con \ n?
El \ n nunca coincidirá con la nueva línea al final de la línea porque la
nueva línea siempre se elimina antes de que la línea se coloque en el
espacio del patrón. Para obtener 2 o más líneas en el espacio del patrón, use
el comando 'N' o algo similar (como 'H; ...; g;').
Sed funciona así: sed lee una línea a la vez, corta la
nueva línea de terminación, coloca lo que queda en el espacio del patrón donde
el script sed puede abordarlo o cambiarlo, y cuando
se imprime el espacio del patrón , agrega una nueva línea a stdout (o a un archivo). Si el
espacio del patrón se elimina total o parcialmente con 'd' o 'D', la
nueva línea no se agrega en tales casos. Por lo tanto, los guiones como
sed 's/\n//' file # to delete newlines from each line
sed 's/\n/foo\n/' file # to add a word to the end of each line
NUNCA funcionará, porque la nueva línea final se elimina antes de que
la línea se coloque en el espacio del patrón. Para realizar las tareas anteriores,
utilice uno de estos scripts en su lugar:
tr -d '\n' < file # use tr to delete newlines
sed ':a;N;$!ba;s/\n//g' file # GNU sed to delete newlines
sed 's/$/ foo/' file # add "foo" to end of each line
Dado que las versiones de sed que no sean GNU sed tienen límites para el tamaño del
búfer de patrón, aquí se prefiere la utilidad 'tr' de Unix.
Si la última línea del archivo contiene una nueva línea, GNU sed agregará
esa nueva línea a la salida pero eliminará todas las demás, mientras que tr
eliminará todas las nuevas líneas.
Para hacer coincidir un bloque de dos o más líneas, hay 3 opciones básicas:
(1) utilice el comando 'N' para agregar la línea Siguiente al espacio del patrón;
(2) use el comando 'H' al menos dos veces para agregar la línea actual
al espacio de Retención, y luego recupere las líneas del espacio de retención
con x, g o G; o (3) use rangos de direcciones (consulte la sección 3.3, arriba)
para unir líneas entre dos direcciones especificadas.
Las opciones (1) y (2) colocarán un \ n en el espacio del patrón, donde se
puede abordar como se desee ('s / ABC \ nXYZ / alphabet / g'). Un ejemplo
del uso de 'N' para eliminar un bloque de líneas aparece en la sección 4.13
("¿Cómo elimino un bloque de líneas específicas consecutivas?"). Este
ejemplo se puede modificar cambiando el comando de eliminación a otra
cosa, como 'p' (imprimir), 'i' (insertar), 'c' (cambiar), 'a' (agregar)
o 's' (sustituir) .
La opción (3) no colocará un \ n en el espacio del patrón, pero sí
coincide con un bloque de líneas consecutivas, por lo que es posible que ni
siquiera necesite el \ n para encontrar lo que está buscando. Dado que GNU sed
versión 3.02.80 ahora admite esta sintaxis:
sed '/start/,+4d' # to delete "start" plus the next 4 lines,
Además de las
direcciones de rango tradicionales '/ from here /, / to there / {...}' , es posible evitar el uso de \ n por completo.
tr
es solo la herramienta adecuada para el trabajo si reemplaza un solo carácter por un solo carácter, mientras que el ejemplo anterior muestra reemplazar nueva línea con un espacio ... Entonces, en el ejemplo anterior, tr podría funcionar ... Pero sería más adelante limitante.