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 while
bucle, pero un bucle while es una mala práctica. ¿Es posible hacerlo usando tr
o 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
paste
es que no dejará una línea sin terminar. Por ejemplo, si elimina cada nueva línea en un archivo (como contr -d '\n' < file
otr '\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 usarlopaste
para eso (como enpaste -sd '\0' file
opaste -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
sed
enfoque 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
sed
para esto como se muestra a continuación:fuente
Otra forma es usar
xargs
:dónde
Aunque, esta solución es bastante excesiva porque
echo
se 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
echo
implementación, también tendrá problemas con los caracteres de barra invertida o algunas líneas que comienzan con-
(como--help
o-nene
con GNUecho
). También tenga en cuenta que-d
es 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
J
comando, luego use el%norm
comando 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,
$0
seguida de un espacio o una nueva línea, dependiendo de si el número de líneaNR
es impar o par.La expresión
NR%2?" ":"\n"
es una declaración ternaria. La expresión seNR%2
evalú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?" ":RS
se 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
. El1
final 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'
ORS
solución.Solución genérica, reemplazar
5
con el número de líneas requeridasfuente
Puedes usar
awk
para esto:Produce:
dónde:
Las
awk
acciones se ejecutan para cada línea, la variable especial hace$0
referencia a la línea actual,NR
es 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%2
es verdadero, es decir, para números de línea impares.La
awk
sintaxis es similar a C, pero algunos elementos son opcionales en algunos contextos, por ejemplo, punto y coma.fuente
c
variable esORS
:'NR%2{ORS=" "}1;{ORS=RS}'
Utilizando
ed
:Los
ed
comandos de edición, para cada línea (g
aplica 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
n
líneas se unirán. Supongamos quen = 3
el 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
ruby
está 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.