Wie entferne ich Zeilenumbrüche aus einer Textdatei?

116

Ich habe die folgenden Daten und muss alles in einer Zeile zusammenfassen.

Ich habe das:

22791

;

14336

;

22821

;

34653

;

21491

;

25522

;

33238

;

Ich brauche das:

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

BEARBEITEN

Keiner dieser Befehle funktioniert einwandfrei.

Die meisten von ihnen lassen die Daten so aussehen:

22791

;14336

;22821

;34653

;21491

;25522
Alucard
quelle
15
Kopieren und Einfügen in die Adressleiste des Browsers oder in ein anderes Textfeld. Quick'n'dirty, funktioniert aber für kleine Datenmengen.
Ignis

Antworten:

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

Bearbeiten:

Wenn keiner der hier veröffentlichten Befehle funktioniert, haben Sie etwas anderes als eine neue Zeile, die Ihre Felder trennt. Möglicherweise haben Sie DOS / Windows-Zeilenenden in der Datei (obwohl ich erwarten würde, dass die Perl-Lösungen auch in diesem Fall funktionieren)?

Versuchen:

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

Wenn dies nicht funktioniert, müssen Sie Ihre Datei genauer untersuchen (z. B. in einem Hex-Editor), um herauszufinden, welche Zeichen sich tatsächlich darin befinden, die Sie entfernen möchten.

Tyler McHenry
quelle
7
Wie schreibt man diese Ausgabe in dieselbe oder eine andere Datei?
Goldname
3
Ich denke, trist nicht für leere Zeilen geeignet. Was denken Sie? - - Ich denke, sedist die beste Option wie hier beschrieben stackoverflow.com/q/16414410/54964
Léo Léopold Hertz 준영
Um die Ausgabe in eine andere Datei weiterzuleiten, verwenden Sie einfach die Ausgabeverleitung. Um es an dieselbe Datei weiterzuleiten, leiten Sie es an "sponge" weiter (verfügbar im Paket "moreutils" auf Debian-Basissystemen).
Plugwash
11
perl -p -i -e 's/\R//g;' filename

Muss den Job machen.

ZyX
quelle
Golf zuperl -pie 's/\R//g' filename
Trenton
9
paste -sd "" file.txt
Amardeep AC9MF
quelle
1
Unter Solaris (10) paste -sd ""funktioniert STDIN standardmäßig nicht. Wenn Sie also eine (some command) | paste -sd "" -
Weiterleitung durchführen
Dies funktioniert nicht, wenn Sie auch die letzte neue Zeile entfernen möchten. Es werden nur Zwischenzeilen entfernt.
Josch
Dies funktionierte unter Mac OS nicht, Sundeeps Version schon. paste -sd'\0' -
Trenton
7
tr -d '\n' < file.txt

Oder

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

Oder

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

Diese Seite hier enthält eine Reihe weiterer Methoden zum Entfernen von Zeilenumbrüchen.

bearbeitet, um Katzenmissbrauch zu entfernen :)

Vivin Paliath
quelle
4

verwenden

head -n 1 filename | od -c 

um herauszufinden, WAS der beleidigende Charakter ist. dann benutze

tr -d '\n' <filename

für LF

tr -d '\r\n' <filename

für CRLF

MrE
quelle
4

Sie können die Datei in vim bearbeiten:

$ vim inputfile
:%s/\n//g
loganaayahee
quelle
2
und durch Leerzeichen zu ersetzen::%s/\n/ /g
Remi Mélisson
2

Mit 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
quelle
2

Nerd-Fakt: Verwenden Sie stattdessen ASCII.

tr -d '\012' < filename.extension   

(Bearbeitet, weil ich die verdammte Antwort nicht gesehen habe, die dieselbe Lösung hatte, nur der Unterschied war, dass meine ASCII hatte)

Byfjunarn
quelle
2

Verwenden Sie sed mit POSIX-Klassen

Dadurch werden alle Zeilen entfernt, die nur Leerzeichen enthalten (Leerzeichen und Tabulatoren).

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

Nehmen Sie einfach das, womit Sie arbeiten, und leiten Sie es weiter

Beispiel

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

jasonleonhard
quelle
sed -i '/ ^ [[: space:]] * $ / d' Dateiname ... für die Bearbeitung an Ort und Stelle; Antwort wie oben wird auf dem Bildschirm
ausgegeben
1
$ perl -0777 -pes / \ n + // g 'Eingabe> Ausgabe
$ perl -0777 -pe 'tr / \ n // d' Eingabe> Ausgabe
Greg Bacon
quelle
1

Wenn sich die Daten in file.txt befinden, dann:

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

Das ' $(<file.txt)' liest die Datei und gibt den Inhalt als eine Reihe von Wörtern an, die 'echo' dann mit einem Leerzeichen dazwischen wiedergeben. Der Befehl 'tr' löscht dann alle Leerzeichen:

22791;14336;22821;34653;21491;25522;33238;
Jonathan Leffler
quelle
Dies funktioniert, solange die Eingabe nicht zu groß ist und solange Sie Bash verwenden (markiert für Bash, das ist also in Ordnung). Würde ich jetzt die Antwort schreiben, wäre es tr -d '\n' < file.txtdas, was die akzeptierte Antwort tut (und ich bin überrascht, dass ich sie zu diesem Zeitpunkt nicht geschrieben habe). Dies wurde wahrscheinlich nur geschrieben, um "noch einen anderen Weg zu zeigen".
Jonathan Leffler
1

xargs verbraucht auch Zeilenumbrüche (fügt aber eine letzte nachfolgende Zeilenumbruch hinzu):

xargs < file.txt | tr -d ' '
marky
quelle
1

Angenommen, Sie möchten nur die Ziffern und Semikolons beibehalten, sollte das Folgende den Trick ausführen, vorausgesetzt, es gibt keine größeren Codierungsprobleme, es wird jedoch auch die allerletzte "neue Zeile" entfernt:

$ tr -cd ";0-9"

Sie können die obigen Angaben leicht ändern, um andere Zeichen einzuschließen, z. B. wenn Sie Dezimalstellen, Kommas usw. beibehalten möchten.

Gipfel
quelle
1

Verwenden des gedit-Texteditors (3.18.3)

  1. Klicken Sie auf Suchen
  2. Klicken Sie auf Suchen und Ersetzen ...
  3. Geben Sie \n\sin das Feld Suchen ein
  4. Lassen Sie Ersetzen durch leer (nichts)
  5. Überprüfen Sie Regulärer Ausdruck Feld
  6. Klicken Sie auf die Schaltfläche Suchen

Hinweis: Dies behebt nicht genau das ursprüngliche, 7 Jahre alte Problem des OP, sollte jedoch einigen Noob-Linux-Benutzern (wie mir) helfen, die ihren Weg von den SEs hierher finden, mit ähnlichen Fragen: "Wie bekomme ich meinen Text alle in einer Zeile?" .

Hastig Zusammenstellen
quelle
1

Hatte heute den gleichen Fall, super einfach in vim oder nvim, können Sie gJLinien verbinden. Tun Sie es einfach für Ihren Anwendungsfall

99gJ

Dadurch werden alle Ihre 99 Zeilen verbunden. Sie können die Anzahl 99je nach Anzahl der zu verbindenden Zeilen nach Bedarf anpassen . Wenn nur beitreten 1 Zeile, dann nur gJgut genug ist .

LeOn - Han Li
quelle
0

Ich würde es mit awk machen, zB

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

(Ein Nachteil ist, dass a im Speicher "akkumuliert" ist).

BEARBEITEN

Printf vergessen! Desweiteren

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

oder wahrscheinlich besser, was es schon in den anderen ans mit awk gegeben wurde.

ShinTakezou
quelle
0

Normalerweise erhalte ich diesen Anwendungsfall, wenn ich ein Code-Snippet aus einer Datei kopiere und es in eine Konsole einfügen möchte, ohne unnötige neue Zeilen hinzuzufügen. Am Ende habe ich einen Bash-Alias ​​erstellt
(ich habe es genannt, onelinewenn Sie neugierig sind).

xsel -b -o | tr -d '\n' | tr -s ' ' | xsel -b -i
  • xsel -b -o liest meine Zwischenablage

  • tr -d '\n' entfernt neue Zeilen

  • tr -s ' ' Entfernt wiederkehrende Leerzeichen

  • xsel -b -i schiebt dies zurück in meine Zwischenablage

Danach würde ich den neuen Inhalt der Zwischenablage in einer Konsole oder was auch immer online einfügen.

Mohammad AbuShady
quelle
0

Ihnen fehlt die offensichtlichste und schnellste Antwort, insbesondere wenn Sie dies in der GUI tun müssen, um einen seltsamen Zeilenumbruch zu beheben.

  • Öffnen gedit

  • Dann Ctrl+ H, dann in das FindTextfeld \nund in Replace withein leeres Feld, dann Checkbox Regular expressionund Voila füllen .

Eduard Florinescu
quelle
0

So entfernen Sie auch die nachfolgende neue Zeile am Ende der Datei

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