2012-12-01 17 views

Odpowiedz

5

Można również użyj echo, aby usunąć spacje na początku lub końcu łańcucha, ale także powtarzając spacje wewnątrz łańcucha.

$ myVar=" kokor iiij  ook  " 
$ echo "$myVar" 
    kokor iiij  ook  
$ myVar=`echo $myVar` 
$ 
$ # myVar is not set to "kokor iiij ook" 
$ echo "$myVar" 
kokor iiij ook 
+3

To nie jest niezawodne: jeśli 'myVar' zawiera specjalne znaki takie jak' * ', powłoka rozszerzy go o pliki z bieżącego katalogu. –

+0

Jako # bash na freenode zawsze mówi ...użyj więcej cytatów. 'echo" $ myvar "' zapobiega ekspansji globów, itp. – bobpaul

+0

@bobpaul, zapobiega rozszerzaniu się globów, itp., ale zawiera także wiodące i końcowe białe znaki, których Mickaël zamierzał się pozbyć :( –

1

zabawny sposób, aby usunąć wszystkie spacje ze zmiennej jest użycie printf:

$ myvar='a cool variable with lots of spaces in it' 
$ printf -v myvar '%s' $myvar 
$ echo "$myvar" 
acoolvariablewithlotsofspacesinit 

Okazuje się, że to nieco bardziej wydajny niż myvar="${myvar// /}", ale nie jest bezpieczne dotyczące globs (*), które mogą pojawić się w ciągu znaków. Więc nie używaj go w kodzie produkcyjnym.

Jeśli naprawdę naprawdę chcesz użyć tej metody i są naprawdę martwi się o rzeczy globowania (i naprawdę powinno), można użyć set -f (który wyłącza globbing łącznie):

$ ls 
file1 file2 
$ myvar=' a cool variable with spaces and oh! no! there is a glob * in it' 
$ echo "$myvar" 
    a cool variable with spaces and oh! no! there is a glob * in it 
$ printf '%s' $myvar ; echo 
acoolvariablewithspacesandoh!no!thereisaglobfile1file2init 
$ # See the trouble? Let's fix it with set -f: 
$ set -f 
$ printf '%s' $myvar ; echo 
acoolvariablewithspacesandoh!no!thereisaglob*init 
$ # Since we like globbing, we unset the f option: 
$ set +f 

Zamieściłem ten odpowiedz tylko dlatego, że jest zabawnie, nie używać go w praktyce.

+0

Jednak w tym przypadku cytaty są wyraźnie pominięte, aby usunąć wiodące białe znaki, więc globalne znaki są w grze –

+0

Skondensowane do bezpiecznej jednej linii: 'myvar =" $ (set -f; printf "% s" $ myvar) "; echo" [$ myvar] " –

3

Ponieważ używasz bash, najszybszym sposobem byłoby:

shopt -s extglob # Allow extended globbing 
var=" lakdjsf lkadsjf " 
echo "${var//+([[:space:]])/}" 

To najszybsza, ponieważ korzysta z wbudowanych funkcji zamiast rozpalania dodatkowych procesów.

Jeśli jednak chcesz to zrobić w taki sposób, POSIX zgodny użyć sed:

var=" lakdjsf lkadsjf " 
echo "$var" | sed 's/[[:space:]]//g' 
+0

W nieinteraktywnej powłoce (tj. skrypcie), musisz najpierw" shopt-s extglob " –

+0

@glennjackman Dobry chwyt Zobacz moje aktualizacje –

66

Narzędzia sed lub tr zrobi to za ciebie przez zamianę spacje za nic

sed 's/ //g'

tr -d ' '

przykład:

$ echo " 3918912k " | sed 's/ //g' 
3918912k 
+3

Działa doskonale. To powinno być akceptowane Odpowiedź: – phpguru

+0

Rzeczywiście, obecnie akceptowaną odpowiedzią nie jest POSIX. W przypadku skryptów przenośnych ta odpowiedź jest lepsza. – MoonSweep

Powiązane problemy