Procesando texto, necesito eliminar el carácter de nueva línea cada dos líneas.
Texto de ejemplo:
this is line one
and this is line two
the third and the
fourth must be pasted too
Salida deseada:
this is line one and this is line two
the third and the fourth must be pasted too
Intenté un whilebucle, pero un bucle while es una mala práctica. ¿Es posible hacerlo usando tro cualquier otro comando?
text-processing
jomaweb
fuente
fuente

Respuestas:
paste(también una utilidad simple estándar POSIX comotr) es su herramienta para eso.Suponiendo que desea que esos caracteres de nueva línea se reemplacen con un espacio en lugar de simplemente eliminarse como en su muestra:
O:
Reemplace
' 'con'\0'si realmente desea que se eliminen.Para reemplazar 2 de 3:
1 de 3, comenzando con el segundo:
Y así.
Otra cosa buena
pastees que no dejará una línea sin terminar. Por ejemplo, si elimina cada nueva línea en un archivo (como contr -d '\n' < fileotr '\n' ' ' < file), termina sin ninguna línea ya que las líneas deben terminarse con un carácter de nueva línea. Por lo tanto, generalmente es mejor usarlopastepara eso (como enpaste -sd '\0' fileopaste -sd ' ' file) que agregará ese carácter de nueva línea final necesario para tener texto válido.fuente
Con sed moderno GNU
Y awk
fuente
sedenfoque significa sorber todo el archivo en la memoria (siempre que no contenga bytes NUL) y realizar una costosa sustitución de expresiones regulares. No puedo ver el beneficio sobre elsed 'N;s/\n/ /'enfoque estándar .Use
sedpara esto como se muestra a continuación:fuente
Otra forma es usar
xargs:dónde
Aunque, esta solución es bastante excesiva porque
echose ejecuta un proceso para cada línea ... Por lo tanto, además de los ejemplos de juguetes, se debe preferir una solución basada en awk / sed o similar.fuente
echoimplementación, también tendrá problemas con los caracteres de barra invertida o algunas líneas que comienzan con-(como--helpo-nenecon GNUecho). También tenga en cuenta que-des una extensión GNU.echo, puede usar esto:< txt xargs -d '\n' -n 2 printf -- '%s %s\n'Esto es realmente extremadamente simple en vim. Para unir cada línea, use el
Jcomando, luego use el%normcomando para aplicarlo a cada línea simultáneamente. Por ejemplo(Solo en caso de que no estés familiarizado con vim,
<CR>solo significa entrar)Esto incluso funciona para unir un número arbitrario de líneas. Por ejemplo, unir cada diez líneas sería
Si no se siente cómodo con vim y prefiere usarlo como una herramienta de línea de comandos, en lugar de un editor de texto interactivo, puede hacer lo siguiente:
fuente
Esto imprime cada línea,
$0seguida de un espacio o una nueva línea, dependiendo de si el número de líneaNRes impar o par.La expresión
NR%2?" ":"\n"es una declaración ternaria. La expresión seNR%2evalúa como verdadera (distinta de cero) si el número de fila es impar. En el caso, la expresión ternaria devuelve un espacio. Si se evalúa como falso (cero), se devuelve la nueva línea.Alternativa
Como lo sugirió Costas en los comentarios:
Aquí, la declaración ternaria
NR%2?" ":RSse usa para devolver un espacio o el separador de registro de entrada (RS, predeterminado = nueva línea). Este valor se asigna al separador de registro de salida,ORS. El1final del comando es la abreviatura críptica de awk para imprimir el registro.fuente
()paréntesis y el espacio despuésprintf;)'NR%2{printf("%s ",$0);next}1''{ORS=(NR%2?" ":RS)}1'ORSsolución.Solución genérica, reemplazar
5con el número de líneas requeridasfuente
Puedes usar
awkpara esto:Produce:
dónde:
Las
awkacciones se ejecutan para cada línea, la variable especial hace$0referencia a la línea actual,NRes el número de línea actual (comenzando en 1). La segunda acción está protegida por la expresiónNR%2, que es la operación de módulo. Por lo tanto,c=" "solo se ejecuta siNR%2es verdadero, es decir, para números de línea impares.La
awksintaxis es similar a C, pero algunos elementos son opcionales en algunos contextos, por ejemplo, punto y coma.fuente
cvariable esORS:'NR%2{ORS=" "}1;{ORS=RS}'Utilizando
ed:Los
edcomandos de edición, para cada línea (gaplica un conjunto de comandos de edición a cada línea que coincida con la expresión regular dada), agregarán un carácter de espacio al final y lo unirán a la siguiente línea. Luego escribe el texto resultante en un archivo llamadotext.new.fuente
Con Ruby
Supongo que cada bloque de
nlíneas se unirán. Supongamos quen = 3el archivo de entrada es'infile'y los resultados deben escribirse en el archivo'outfile'.Construir un archivo
Confirme el contenido del archivo.
Eliminar nuevas líneas y escribir en el archivo
Confirmar contenidos
fuente
rubyestá fuera de tema en U&L. Pero, dado que lo está utilizando desde la línea de comandos conruby -e, eso lo convierte en un tema suficiente.