Jak usunąć wszystkie spacje z podanego pliku tekstowego

81

Chcę usunąć wszystkie spacje z podanego pliku tekstowego. Czy jest do tego dostępne jakieś polecenie powłoki? Lub jak używać seddo tego celu.

Chcę coś takiego poniżej:

$ cat hello.txt | sed ....

Próbowałem tego: cat hello.txt | sed 's/ //g'.Ale usuwa tylko spacje, a nie tabulatory.

Grzyby księżycowe
źródło
3
przez „wszystkie białe spacje”, czy masz na myśli również nowe linie?
glenn jackman

Odpowiedzi:

133
$ 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.

Aby wyczyścić wszystkie spacje, w tym znaki nowej linii, możesz spróbować:

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

Możesz także użyć klas postaci zdefiniowanych przez tr (kredyty do komentarza htompkins ):

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

Na przykład, aby usunąć tylko poziomą białą przestrzeń:

cat file.txt | tr -d "[:blank:]"
Paulo Scardine
źródło
23
Możesz także użyć klas znaków zdefiniowanych przez tr. Przykłady: Aby usunąć wszystkie białe spacje: cat file.txt | tr -d "[:space:]" Aby usunąć wszystkie poziome spacje:cat file.txt | tr -d "[:blank:]"
htompkins
@ user3901666 usunie spacje, tak, jeśli wynik będzie zgodny z tym, co chcesz, trudno powiedzieć - czego próbowałeś?
Paulo Scardine,
24

O wiele prostsze moim zdaniem:

sed -r 's/\s+//g' filename
Lucie G
źródło
2
Właśnie to wypróbowałem i wyprowadza zmieniony tekst do STDOUT, ale nie zmienia samego pliku.
Max Williams,
4
@MaxWilliams - po prostu użyj flagi -i (kreska i) z
sedem
1
Nie usuwa to nowych linii, nie jestem pewien, czy było to pożądane przez OP.
Graeme Moss
11

Myślę, że możesz użyć seda, aby wyczyścić przestrzeń, nie tracąc przy tym informacji, jak przejście na inną linię.

cat hello.txt | sed '/^$/d;s/[[:blank:]]//g'
Umae
źródło
4
Dobrze, ale nie sądzę, żebym był w stanie zmusić się do pisaniatr -d " " < infile.txt > outfile.txt
NReilingh
Witam, to działa, ale byłbym wdzięczny za wyjaśnienie.
David Okwii
11

Spróbuj tego:

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

(znalezione tutaj )

Pierwsza część usuwa wszystkie tabulatory ( \t) i spacje, a druga część usuwa wszystkie puste wiersze

klucze
źródło
1
To faktycznie działa. Spróbuj wyjaśnić sed -e 's / [\ t] // g; / ^ $ / d' szczególnie / ^ $ / d '. Wiem, że ^ oznacza początek łańcucha, $ oznacza koniec. / d służy do usuwania podczas używania seda. Ale w jaki sposób ta interpretacja prowadzi do usunięcia białych znaków?
David Okwii
Dodałem wyjaśnienie. ^$dopasowuje pusty wiersz, ponieważ szuka „początku wiersza” (^), a następnie bezpośrednio po nim „końca wiersza” ($).
Keyser
6

Jeśli chcesz usunąć WSZYSTKIE spacje, nawet nowe linie:

perl -pe 's/\s+//g' file
glenn jackman
źródło
4

Najłatwiejszy sposób dla mnie ->

        echo "Hello my name is Donald" | sed  s/\ //g
DDD
źródło
2

To prawdopodobnie najprostszy sposób na zrobienie tego:

sed -r 's/\s+//g' filename > output
mv ouput filename
Gorton Fishman
źródło
2

Spróbuj tego:

tr -d " \t" <filename

Zobacz stronę podręcznika tr (1) po więcej szczegółów.

user3653982
źródło
2

Stary, po prostu python test.py w twoim terminalu.

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
źródło
Przepraszam, że wbijam stary wątek, ale czy nie jest f.read().strip("\t\n\r ")bardziej wydajny?
Jachdich
Co się stanie, jeśli pojawią się co najmniej dwie kolejne spacje, tabulatory itp. Czarno-białe słowa? Myślę, że twoje rozwiązanie dotyczy wiodących i końcowych odstępów. Jeśli chcesz mieć jedną wkładkę, możesz łatwo przekonwertować powyższy kod.
Agnibesh Chauhan
2

Ta odpowiedź jest podobna do innej, jednak niektórzy ludzie narzekają, że dane wyjściowe trafiają do STDOUT, mam zamiar zasugerować przekierowanie go do oryginalnego pliku i nadpisanie go. Normalnie nigdy bym tego nie sugerował, ale czasami szybkie i brudne prace.

cat file.txt | tr -d " \t\n\r" > file.txt
Omar Essilfie-Quaye
źródło
1

hmm ... wygląda na to, że coś w kolejności sed -e "s/[ \t\n\r\v]//g" < hello.txtpowinno być w odpowiednim miejscu (w każdym razie wydaje się działać pod cygwin).

Jerry Coffin
źródło