¿Cómo elimino nuevas líneas de un archivo de texto?


116

Tengo los siguientes datos y necesito ponerlos todos en una línea.

Tengo esto:

22791

;

14336

;

22821

;

34653

;

21491

;

25522

;

33238

;

Necesito este:

22791;14336;22821;34653;21491;25522;33238;

EDITAR

Ninguno de estos comandos funciona perfectamente.

La mayoría de ellos deja que los datos se vean así:

22791

;14336

;22821

;34653

;21491

;25522

15
Copie y pegue en la barra de direcciones del navegador o en otro campo de texto. Quick'n'dirty pero funciona para pequeñas cantidades de datos.
ignis

Respuestas:


245
tr -d '\n' < yourfile.txt

Editar:

Si ninguno de los comandos publicados aquí funciona, entonces tiene algo más que una nueva línea que separa sus campos. Posiblemente tenga terminaciones de línea DOS / Windows en el archivo (aunque esperaría que las soluciones Perl funcionen incluso en ese caso).

Tratar:

tr -d "\n\r" < yourfile.txt

Si eso no funciona, entonces tendrá que inspeccionar su archivo más de cerca (por ejemplo, en un editor hexadecimal) para averiguar qué caracteres hay realmente allí que desea eliminar.


7
¿Cómo se escribe esta salida en el mismo archivo o en otro?
Goldname

3
Creo que trno es adecuado para líneas vacías. ¿Qué piensas? - - Creo que sedes la mejor opción como se describe aquí stackoverflow.com/q/16414410/54964
Léo Léopold Hertz 준영

Para enrutar la salida a otro archivo, simplemente use la redirección de salida. Para enrutarlo al mismo archivo, canalícelo a "sponge" (disponible en el paquete "moreutils" en los sistemas base Debian).
Plugwash

Para escribir la salida en el mismo archivo, use un subshellecho -n $(tr -d "\n" < yourfile.txt) > yourfile.txt
pei

11
perl -p -i -e 's/\R//g;' filename

Debe hacer el trabajo.


Golf aperl -pie 's/\R//g' filename
Trenton

9
paste -sd "" file.txt

1
En Solaris (10) paste -sd ""no funciona en STDIN de forma predeterminada, por lo que si lo está utilizando, use: (some command) | paste -sd "" -
JohnGH

Esto no funciona si también desea eliminar la nueva línea final . Solo elimina las nuevas líneas intermedias.
Josch

Esto no funcionó en Mac OS, la versión de Sundeep sí. paste -sd'\0' -
Trenton

7
tr -d '\n' < file.txt

O

awk '{ printf "%s", $0 }' file.txt

O

sed ':a;N;$!ba;s/\n//g' file.txt

Esta página aquí tiene un montón de otros métodos para eliminar nuevas líneas.

editado para eliminar el abuso felino :)


4

utilizar

head -n 1 filename | od -c 

para averiguar CUÁL es el personaje ofensivo. luego usa

tr -d '\n' <filename

para LF

tr -d '\r\n' <filename

para CRLF



2

Usando man 1 ed:

# cf. http://wiki.bash-hackers.org/doku.php?id=howto:edit-ed 
ed -s file <<< $'1,$j\n,p'  # print to stdout 
ed -s file <<< $'1,$j\nwq'  # in-place edit

2

Dato curioso: usa ASCII en su lugar.

tr -d '\012' < filename.extension   

(Editado porque no vi la maldita respuesta que tenía la misma solución, la única diferencia era que la mía tenía ASCII)


2

Usa sed con clases POSIX

Esto eliminará todas las líneas que contengan solo espacios en blanco (espacios y tabulaciones)

sed '/^[[:space:]]*$/d'

Simplemente tome lo que sea con lo que esté trabajando y canalícelo a eso

Ejemplo

cat filename | sed '/^[[:space:]]*$/d'


sed -i '/ ^ [[: espacio:]] * $ / d' nombre de archivo ... para edición en el lugar; la respuesta como la anterior aparecerá en la pantalla
BradChesney79

1
$ perl -0777 -pe 's / \ n + // g' entrada> salida
$ perl -0777 -pe 'tr / \ n // d' entrada> salida

1

Si los datos están en file.txt, entonces:

echo $(<file.txt) | tr -d ' '

El " $(<file.txt)" lee el archivo y da el contenido como una serie de palabras que "hacen eco" luego hacen eco con un espacio entre ellas. El comando 'tr' borra todos los espacios:

22791;14336;22821;34653;21491;25522;33238;

Esto funciona siempre que la entrada no sea demasiado grande y mientras esté usando Bash (etiquetado para Bash, así que está bien). Si estuviera escribiendo la respuesta ahora, sería tr -d '\n' < file.txt, que es lo que hace la respuesta aceptada (y me sorprende no haberla escrito en ese momento). Esto probablemente fue escrito para mostrar 'otra forma más de hacerlo'.
Jonathan Leffler

1

xargs también consume líneas nuevas (pero agrega una línea nueva final):

xargs < file.txt | tr -d ' '

1

Suponiendo que solo desea mantener los dígitos y el punto y coma, lo siguiente debería funcionar asumiendo que no hay problemas importantes de codificación, aunque también eliminará la última "nueva línea":

$ tr -cd ";0-9"

Puede modificar fácilmente lo anterior para incluir otros caracteres, por ejemplo, si desea conservar puntos decimales, comas, etc.


1

Usando el editor de texto gedit (3.18.3)

  1. Haga clic en Buscar
  2. Haga clic en Buscar y reemplazar ...
  3. Entrar \n\sen el campo Buscar
  4. Dejar Reemplazar con blanco (nada)
  5. Marque la casilla de expresión regular
  6. Haga clic en el botón Buscar

Nota: esto no aborda exactamente el problema original de 7 años del OP, pero debería ayudar a algunos usuarios novatos de Linux (como yo) que encuentran su camino aquí desde los SE con preguntas similares de "cómo consigo mi texto todo en una línea" .


1

Estaba teniendo el mismo caso hoy, súper fácil en vim o nvim, puede usar gJpara unir líneas. Para su caso de uso, simplemente haga

99gJ

esto unirá todas sus 99 líneas. Puede ajustar el número 99según sea necesario según la cantidad de líneas que desee unir. Si solo se une a 1 línea, entonces solo gJes suficiente.


0

Lo haría con awk, p. Ej.

awk '/[0-9]+/ { a = a $0 ";" } END { print a }' file.txt

(una desventaja es que a se "acumula" en la memoria).

EDITAR

¡Olvidé printf! Así también

awk '/[0-9]+/ { printf "%s;", $0 }' file.txt

o probablemente mejor, lo que ya se le dio en los otros ans usando awk.


0

Por lo general, obtengo este caso de uso cuando estoy copiando un fragmento de código de un archivo y quiero pegarlo en una consola sin agregar nuevas líneas innecesarias, terminé haciendo un alias de bash
(lo llamé onelinesi tiene curiosidad)

xsel -b -o | tr -d '\n' | tr -s ' ' | xsel -b -i
  • xsel -b -o lee mi portapapeles

  • tr -d '\n' elimina nuevas líneas

  • tr -s ' ' elimina los espacios recurrentes

  • xsel -b -i empuja esto de vuelta a mi portapapeles

después de eso, pegaría el nuevo contenido del portapapeles en línea en una consola o lo que sea.


0

Se está perdiendo la respuesta más obvia y rápida, especialmente cuando necesita hacer esto en la GUI para corregir un ajuste de palabras extraño.

  • Abierto gedit

  • Luego Ctrl+ H, luego coloque en el Findcuadro de texto \ny en Replace withun espacio vacío, luego complete la casilla de verificación Regular expressiony listo.


0

Para eliminar también la nueva línea final al final del archivo

python -c "s=open('filename','r').read();open('filename', 'w').write(s.replace('\n',''))"
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.