So entfernen Sie alle Leerzeichen aus einer bestimmten Textdatei

81

Ich möchte alle Leerzeichen aus einer bestimmten Textdatei entfernen. Gibt es dafür einen Shell-Befehl? Oder wie man es sedfür diesen Zweck benutzt.

Ich möchte so etwas wie unten:

$ cat hello.txt | sed ....

Ich habe cat hello.txt | sed 's/ //g'Folgendes versucht: Aber es werden nur Leerzeichen entfernt, keine Tabulatoren.

Mondpilze
quelle
3
Meinen Sie mit "All Whitespace" auch Zeilenumbrüche?
Glenn Jackman

Antworten:

132
$ man tr
NAME
    tr - translate or delete characters

SYNOPSIS
    tr [OPTION]... SET1 [SET2]

DESCRIPTION
   Translate, squeeze, and/or delete characters from standard 
   input, writing to standard output.

Um alle Leerzeichen einschließlich Zeilenumbrüche zu löschen, können Sie Folgendes versuchen:

cat file.txt | tr -d " \t\n\r" 

Sie können auch die durch tr definierten Zeichenklassen verwenden (Credits für htompkins Kommentar):

cat file.txt | tr -d "[:space:]"

Zum Beispiel, um nur horizontale Leerzeichen zu löschen:

cat file.txt | tr -d "[:blank:]"
Paulo Scardine
quelle
23
Sie können auch die durch definierten Zeichenklassen verwenden tr. Beispiele: So löschen Sie alle Leerzeichen: cat file.txt | tr -d "[:space:]" So löschen Sie alle horizontalen Leerzeichen:cat file.txt | tr -d "[:blank:]"
htompkins
@ user3901666 es wird Leerzeichen entfernen, ja, wenn die erzeugte Ausgabe mit dem übereinstimmt, was Sie wollen, ist schwer zu sagen - was haben Sie versucht?
Paulo Scardine
24

Meiner Meinung nach viel einfacher:

sed -r 's/\s+//g' filename
Lucie G.
quelle
2
Ich habe es gerade versucht und es gibt den geänderten Text an STDOUT aus, ändert aber nicht die Datei selbst.
Max Williams
4
@ MaxWilliams - verwenden Sie einfach die Flagge -i (Strich i) mit sed
JeffCharter
1
Dies entfernt keine Zeilenumbrüche, nicht sicher, ob dies von OP gewünscht wurde.
Graeme Moss
11

Ich denke, Sie können sed verwenden, um den Raum auszulöschen, ohne dabei Informationen zu verlieren, wie wenn Sie zu einer anderen Zeile wechseln.

cat hello.txt | sed '/^$/d;s/[[:blank:]]//g'
Umae
quelle
4
tr -d " " < infile.txt > outfile.txt
Gut
Hallo, das funktioniert danke, aber ich würde mich über eine Erklärung freuen.
David Okwii
10

Versuche dies:

sed -e 's/[\t ]//g;/^$/d' 

( hier gefunden )

Der erste Teil entfernt alle Tabulatoren ( \t) und Leerzeichen und der zweite Teil entfernt alle leeren Zeilen

Keyser
quelle
Das funktioniert tatsächlich. Achten Sie darauf, sed -es / [\ t] // g; / ^ $ / d 'besonders / ^ $ / d' zu erklären. Ich weiß, ^ ist für den Anfang der Zeichenfolge, $ ist für das Ende. / d dient zum Löschen bei Verwendung von sed. Aber wie führt diese Interpretation zur Löschung von Leerzeichen?
David Okwii
Ich habe eine Erklärung hinzugefügt. ^$Entspricht einer leeren Zeile, da nach "Zeilenanfang" (^) und unmittelbar danach nach "Zeilenende" ($) gesucht wird.
Keyser
5

Wenn Sie ALLE Leerzeichen entfernen möchten , auch Zeilenumbrüche:

perl -pe 's/\s+//g' file
Glenn Jackman
quelle
4

Einfachster Weg für mich ->

        echo "Hello my name is Donald" | sed  s/\ //g
DDD
quelle
2

Dies ist wahrscheinlich der einfachste Weg, dies zu tun:

sed -r 's/\s+//g' filename > output
mv ouput filename
Gorton Fishman
quelle
2

Versuche dies:

tr -d " \t" <filename

Weitere Informationen finden Sie in der Manpage zu tr (1).

user3653982
quelle
2

Alter, einfach python test.py in deinem Terminal.

f = open('/home/hduser/Desktop/data.csv' , 'r')

x = f.read().split()
f.close()

y = ' '.join(x)
f = open('/home/hduser/Desktop/data.csv','w')
f.write(y)
f.close()
Agnibesh Chauhan
quelle
Tut mir leid, einen alten Thread zu stoßen, ist aber nicht f.read().strip("\t\n\r ")effizienter?
Jachdich
Was ist, wenn zwei oder mehr nachfolgende Leerzeichen, Tabulatoren usw. s / w-Wörter vorhanden sind? Ich denke, Ihre Lösung besteht darin, Leerzeichen zu führen und zu verfolgen. Wenn Sie einen Liner möchten, können Sie den obigen Code einfach konvertieren.
Agnibesh Chauhan
2

Diese Antwort ähnelt der anderen, da sich einige Leute beschwert haben, dass die Ausgabe an STDOUT geht. Ich werde nur vorschlagen, sie in die Originaldatei umzuleiten und zu überschreiben. Normalerweise würde ich das nie vorschlagen, aber manchmal schnell und schmutzig.

cat file.txt | tr -d " \t\n\r" > file.txt
Omar Essilfie-Quaye
quelle
1

hmm ... scheint etwas in der Größenordnung von sed -e "s/[ \t\n\r\v]//g" < hello.txtsollte im richtigen Stadion sein (scheint auf jeden Fall unter Cygwin zu funktionieren).

Jerry Sarg
quelle