¿Cómo puedo duplicar las nuevas líneas en una secuencia de salida?

Cuando tengo un flujo de salida:

a b c d e 

¿Cómo puedo duplicar las nuevas líneas?

 un

 segundo

 do

 re

 mi

Solutions Collecting From Web of "¿Cómo puedo duplicar las nuevas líneas en una secuencia de salida?"

 sed G 

es un conocido delineador para eso.

En lo que respecta al performance, lo más efectivo con el cofre de herramientas estándar de Unix sería probablemente:

 paste -d '\n' - /dev/null 

Si no desea agregar una línea vacía después de la última línea:

 sed '$!G' 

Para agregar las líneas vacías antes de las líneas de input:

 paste -d '\n' /dev/null - 

O:

 sed 'i\ /' 

Usando Perl puedes agregar una nueva línea antes

 ...|perl -pe 's/^/\n/' 

o después de cada línea:

 ...|perl -pe 's/$/\n/' 

Con awk , puede definir el Separador de loggings de salida como una doble línea nueva:

 awk -v ORS="\n\n" 1 file 

Luego, 1 realiza la acción awk pnetworkingeterminada: {print $0} , es decir, imprime la línea actual.

usando pr : Paginating Files

 pr -t -d file.txt 

salida:

 un

 segundo

 do

 re

 mi

usando awk :

 awk '{printf("%s\n\n",$0)}' file.txt 

Mientras sed es la elección obvia, otro candidato muy confiable podría ser dd .

Probablemente sea más útil para situaciones en las que lo que importa es más el conteo de bytes que el recuento de líneas, pero los datos de locking y deslocking son lo que mejor hace:

 seq 10| dd cbs=16 conv=block 1 2 3 4 5 6 7 8 9 10 

Eso, hasta ahora, es más como lograr lo opuesto a lo que ha pedido, pero puede bloquear líneas en espacios: traducirá inputs \n líneas en espacios y rellenará esas líneas en cbs=[num] bytes de espacios. Y así, si puedes pnetworkingecir con fiabilidad un máximo de longitud de byte por línea (porque adivinar demasiado bajo resultará en truncamiento) , y luego duplicar esa cifra …

 seq 10 |  dd cbs = 16 conv = bloque |  dd cbs = 8 conv = desbloquear

 1

 2

 3

 4

 5

 6

 7

 8

 9

 10

… puede desbloquearlo en la mitad del cbs , lo que networkingucirá los espacios al final e imprimirá \n ewline cada cbs=[num] bytes. Esto es mucho más útil para manejar grandes volúmenes de datos posiblemente binarys (o para la input del terminal) de lo que sería para files de text comunes, pero es una alternativa, y definitivamente puede competir (a gran escala) en el departamento de performance con solo acerca de todo.

Otra alternativa especializada podría ser nl y tr . Esto solo sería útil si su input se parece a la que se muestra, ya que la solución implica la conversión de espacios en \n ewlines. En cualquier caso, nl siempre insertá al less -w idth +1 bytes de espacios en la cabecera de cada línea que se pasa – si los numera o no. Y entonces puedes …

 printf %s\\nabcde | nl -bn | tr -s \ \\n 

… que imprime:


 un

 segundo

 do

 re

 mi

El -bn indica nl para no numerar el cuerpo de su input, pero aún inserta 6 espacios por defecto, y al less dos, incluso con un argumento -w1 . Esto también puede ser útil para otros casos, como …

 INPUT |nl -bn -w1 |sed '/address/s/ //...' | sed '/^ /!...' 

… en el que el segundo sed siempre sabe qué líneas ha tocado el primero. Pero yo divago…

De todos modos, tr -s califica todas las secuencias entrantes de espacios en un solo byte y tr ansla cada resultado en una \n ewline. Sin el modificador -s , habrá seis nuevas líneas intermedias entre cada alfabético anterior. Y eso se puede configurar de manera confiable tan fácilmente como -w1 .

Aún así, usaría sed . Y hablando de eso, aunque los commands G et e inserir commands ya han sido mencionados, también existen los commands a ppend y c Hange para eso. Hacer cualquiera de los dos sería así:

 printf %s\\nabcde| sed 'a\ ' 
 un

 segundo

 do

 re

 mi

sed G funciona porque tiene el contenido del antiguo búfer almacenado en el búfer de patrones siguiendo una línea de ebullición. H old space está, por defecto, vacío, y así todo lo que obtienes es una línea de \n ewline. Pero, en caso de que haya más en el script sed y el H viejo búfer no esté vacío, entonces siempre puede anexar cualquier cadena a cualquier línea, o bien puede escribir la línea y luego dividirla en una salida como:

 INPUT| sed '...;p;c\ ' 

… con GNU sed la nueva línea real no es necesaria para i , c , o a y las tres se pueden usar como sed '[aic]\\' aunque tal vez sea un mal hábito adoptar. En cualquier caso, cualquiera de estos tres es probablemente less costoso en cuanto a performance que una s/// sustitución porque ninguno implica un patrón de expresiones regulares, aunque dudo si la diferencia es significativa.

Puede canalizar a través de sed :

 .... | sed 's/$/\n/'