2012-12-01 25 views

Antwort

49

Versuchen Sie dies in einer Shell tun:

s=" 3918912k" 
echo ${s//[[:blank:]]/} 

Das nutzt parameter expansion

[[:blank:]] eine Klasse POSIX regex ist (Leerzeichen entfernen, Tabs ...), siehe http://www.regular-expressions.info/posixbrackets.html

+0

Substitution innerhalb Parameter Expansion ist nicht POSIX. Es funktioniert in Bash (und vielleicht anderen Shells, die ich nicht kenne), aber nicht in Dash zum Beispiel. – MoonSweep

5

Sie können auch Verwenden Sie echo, um Leerzeichen entweder am Anfang oder am Ende der Zeichenfolge zu entfernen, aber auch Leerzeichen in der Zeichenfolge zu wiederholen.

$ 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

Dies ist nicht zuverlässig: Wenn 'myVar' Sonderzeichen wie' * 'enthält, wird die Shell diese um die Dateien des aktuellen Verzeichnisses erweitern. –

+0

Wie #bash auf freenode immer sagt ...Verwenden Sie mehr Zitate. 'echo" $ myvar "' verhindert die Expansion von Globs, etc. – bobpaul

+0

@bobpaul, es verhindert die Expansion von Globs, etc., sondern beinhaltet auch die führenden und nachfolgenden Leerzeichen, die Mickaël loswerden wollte :( –

1

Eine lustige Art und Weise alle Räume von einer Variablen zu entfernen, ist printf zu verwenden:

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

Es stellt sich heraus, es ist etwas effizienter als myvar="${myvar// /}", aber nicht sicher in Bezug auf Klackse (*), die angezeigt werden können in der Zeichenfolge. Also nicht im Produktionscode verwenden.

Wenn Sie wirklich, wirklich diese Methode verwenden möchten, und sind wirklich besorgt über die Globbing Sache (und sollten wirklich), können Sie set -f verwenden (die insgesamt deaktiviert Globbing):

$ 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 

Ich stellte diese antworte nur, weil es lustig ist, es nicht in der Praxis zu benutzen.

+0

Allerdings in diesem Fall die Zitate explizit fehlen, um die führenden Leerzeichen zu entfernen, also sind glob chars im Spiel –

+0

Kondense zu einer sicheren Zeile: 'myvar =" $ (set -f; printf "% s" $ myvar) "; echo" [$ myvar] "' –

3

Da Sie bash verwenden, wäre der schnellste Weg sein:

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

Es ist am schnellsten, weil es integrierte Funktionen verwendet anstelle zusätzliche Prozesse Anheizen.

Wenn Sie jedoch in einem POSIX-kompatiblen Art und Weise tun möchten, verwenden Sie sed:

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

In einer nicht-interaktiven Shell (dh ein Skript), müssen Sie für den ersten "shopt -s extglob". –

+0

@ glennjackman Guter Fang. Siehe meine Updates. –

66

Die Werkzeuge sed oder tr wird dies die Leerzeichen für Sie tun nichts durch Vertauschen

sed 's/ //g'

tr -d ' '

Beispiel:

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

Funktioniert perfekt. Dies sollte akzeptiert werden Antwort: – phpguru

+0

Tatsächlich ist die derzeit akzeptierte Antwort nicht POSIX, für portable Skripts ist diese Antwort besser. – MoonSweep

Verwandte Themen