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.


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:]"

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

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'

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


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

4

Einfachster Weg für mich ->

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

2

Dies ist wahrscheinlich der einfachste Weg, dies zu tun:

sed -r 's/\s+//g' filename > output
mv ouput filename

2

Versuche dies:

tr -d " \t" <filename

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


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()

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

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).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.