Comment supprimer les nouvelles lignes d'un fichier texte?

116

J'ai les données suivantes, et je dois tout mettre en une seule ligne.

J'ai ceci:

22791

;

14336

;

22821

;

34653

;

21491

;

25522

;

33238

;

J'ai besoin de ça:

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

ÉDITER

Aucune de ces commandes ne fonctionne parfaitement.

La plupart d'entre eux laissent les données ressembler à ceci:

22791

;14336

;22821

;34653

;21491

;25522
Alucard
la source
15
Copiez-collez dans la barre d'adresse du navigateur ou dans un autre champ de texte. Quick'n'dirty mais fonctionne pour de petites quantités de données.
ignis

Réponses:

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

Éditer:

Si aucune des commandes publiées ici ne fonctionne, vous avez autre chose qu'une nouvelle ligne séparant vos champs. Peut-être avez-vous des fins de ligne DOS / Windows dans le fichier (même si je m'attendrais à ce que les solutions Perl fonctionnent même dans ce cas)?

Essayer:

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

Si cela ne fonctionne pas, vous allez devoir inspecter votre fichier de plus près (par exemple dans un éditeur hexadécimal) pour découvrir quels caractères sont réellement là que vous souhaitez supprimer.

Tyler McHenry
la source
7
Comment écrivez-vous cette sortie dans le même fichier ou dans un autre fichier?
Goldname
3
Je pense que trne convient pas aux lignes vides. Qu'est-ce que tu penses? - - Je pense que sedc'est la meilleure option comme décrit ici stackoverflow.com/q/16414410/54964
Léo Léopold Hertz 준영
Pour acheminer la sortie vers un autre fichier, utilisez simplement la redirection de sortie. Pour le router vers le même fichier, dirigez-le vers "sponge" (disponible dans le paquet "moreutils" sur les systèmes de base Debian).
plugwash le
Pour écrire la sortie dans le même fichier, utilisez un sousecho -n $(tr -d "\n" < yourfile.txt) > yourfile.txt
andpei
11
perl -p -i -e 's/\R//g;' filename

Doit faire le travail.

ZyX
la source
Golfs toperl -pie 's/\R//g' filename
Trenton
9
paste -sd "" file.txt
Amardeep AC9MF
la source
1
Sur Solaris (10) paste -sd ""ne fonctionne pas sur STDIN par défaut, donc si vous y (some command) | paste -sd "" -
connectez
Cela ne fonctionne pas si vous souhaitez également supprimer la dernière nouvelle ligne. Il supprime uniquement les nouvelles lignes intermédiaires.
josch
Cela ne fonctionnait pas sous Mac OS, contrairement à la version de Sundeep. paste -sd'\0' -
Trenton
7
tr -d '\n' < file.txt

Ou

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

Ou

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

Cette page ici a un tas d'autres méthodes pour éliminer les nouvelles lignes.

modifié pour supprimer les abus félins :)

Vivin Paliath
la source
4

utilisation

head -n 1 filename | od -c 

pour comprendre QUEL est le personnage fautif. puis utilisez

tr -d '\n' <filename

pour LF

tr -d '\r\n' <filename

pour CRLF

MrE
la source
4

Vous pouvez modifier le fichier dans vim:

$ vim inputfile
:%s/\n//g
loganaayahee
la source
2
et à remplacer par des espaces::%s/\n/ /g
Remi Mélisson
2

Utilisation de 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
Carlmund
la source
2

Fait nerd: utilisez plutôt ASCII.

tr -d '\012' < filename.extension   

(Modifié parce que je n'ai pas vu la réponse friggin 'qui avait la même solution, la seule différence était que le mien avait ASCII)

Byfjunarn
la source
2

Utiliser sed avec les classes POSIX

Cela supprimera toutes les lignes contenant uniquement des espaces (espaces et tabulations)

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

Prends juste ce avec quoi tu travailles et dirige-le vers ça

Exemple

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

Jasonleonhard
la source
sed -i '/ ^ [[: espace:]] * $ / d' filename ... pour l'édition sur place; réponse comme ci-dessus sera
affichée
1
$ perl -0777 -pe 's / \ n + // g' entrée> sortie
$ perl -0777 -pe 'tr / \ n // d' entrée> sortie
Greg Bacon
la source
1

Si les données sont dans file.txt, alors:

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

Le ' $(<file.txt)' lit le fichier et donne le contenu sous la forme d'une série de mots qui 'écho' puis résonne avec un espace entre eux. La commande 'tr' supprime alors tous les espaces:

22791;14336;22821;34653;21491;25522;33238;
Jonathan Leffler
la source
Cela fonctionne tant que l'entrée n'est pas trop grande et tant que vous utilisez Bash (étiqueté pour Bash, donc c'est OK). Si j'écrivais la réponse maintenant, elle le serait tr -d '\n' < file.txt, ce que fait la réponse acceptée (et je suis surpris de ne pas l'avoir écrite à l'époque). C'était probablement juste écrit pour montrer «encore une autre façon de le faire».
Jonathan Leffler
1

xargs consomme également des nouvelles lignes (mais ajoute une dernière nouvelle ligne à la fin):

xargs < file.txt | tr -d ' '
Marky
la source
1

En supposant que vous ne souhaitiez conserver que les chiffres et les points-virgules, ce qui suit devrait faire l'affaire en supposant qu'il n'y a pas de problèmes d'encodage majeurs, bien que cela supprimera également le tout dernier «saut de ligne»:

$ tr -cd ";0-9"

Vous pouvez facilement modifier ce qui précède pour inclure d'autres caractères, par exemple si vous souhaitez conserver les points décimaux, les virgules, etc.

de pointe
la source
1

Utilisation de l'éditeur de texte gedit (3.18.3)

  1. Cliquez sur Rechercher
  2. Cliquez sur Rechercher et remplacer ...
  3. Entrez \n\sdans le champ Rechercher
  4. Laissez Remplacer par vide (rien)
  5. Cochez la case Expression régulière
  6. Cliquez sur le bouton Rechercher

Remarque: cela ne résout pas exactement le problème d'origine de l'OP, vieux de 7 ans, mais devrait aider certains utilisateurs de noob linux (comme moi) qui trouvent leur chemin ici à partir des SE avec des questions similaires "comment obtenir mon texte sur une seule ligne" .

Hastig Zusammenstellen
la source
1

Avait le même cas aujourd'hui, super facile dans vim ou nvim, vous pouvez utiliser gJpour joindre des lignes. Pour votre cas d'utilisation, faites simplement

99gJ

cela rejoindra toutes vos 99 lignes. Vous pouvez ajuster le nombre 99selon vos besoins en fonction du nombre de lignes à joindre. Si tout se joindre à 1 ligne, alors seulement gJest assez bon.

LeOn - Han Li
la source
0

Je le ferais avec awk, par exemple

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

(un inconvénient est que a est "accumulé" en mémoire).

ÉDITER

Oublié printf! Donc aussi

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

ou probablement mieux, ce qu'il a déjà été donné dans les autres ans en utilisant awk.

ShinTakezou
la source
0

J'obtiens généralement ce cas d'utilisation lorsque je copie un extrait de code à partir d'un fichier et que je veux le coller dans une console sans ajouter de nouvelles lignes inutiles, j'ai fini par faire un alias bash
(je l'ai appelé onelinesi vous êtes curieux)

xsel -b -o | tr -d '\n' | tr -s ' ' | xsel -b -i
  • xsel -b -o lit mon presse-papiers

  • tr -d '\n' supprime les nouvelles lignes

  • tr -s ' ' supprime les espaces récurrents

  • xsel -b -i repousse ça dans mon presse-papiers

après cela, je collerais le nouveau contenu du presse-papiers en ligne dans une console ou autre.

Mohammad AbuShady
la source
0

Il vous manque la réponse la plus évidente et la plus rapide, en particulier lorsque vous devez le faire dans l'interface graphique afin de corriger un retour de mots étrange.

  • Ouvert gedit

  • Puis Ctrl+ H, puis mettez dans la Findzone de texte \net dans Replace withun espace vide puis remplissez la case à cocher Regular expressionet le tour est joué.

Eduard Florinescu
la source
0

Pour supprimer également la nouvelle ligne de fin à la fin du fichier

python -c "s=open('filename','r').read();open('filename', 'w').write(s.replace('\n',''))"
crizCraig
la source