Wie entferne ich Leerzeichen aus Shell-Variablen?


15

In der Befehlszeile habe ich Folgendes ausgeführt:

$ text="name with space"
$ echo $text
name with space

Ich versuche tr -d ' 'die Leerzeichen zu entfernen und habe folgendes Ergebnis:

namewithspace

Ich habe ein paar Dinge ausprobiert wie:

text=echo $text | tr -d ' '

Bis jetzt kein Glück, hoffentlich können Sie wundervollen Leuten helfen!

Antworten:


45

In Bash können Sie die in Bash integrierte Zeichenfolgenmanipulation verwenden. In diesem Fall können Sie Folgendes tun:

> text="some text with spaces"
> echo "${text// /}"
sometextwithspaces

Weitere Informationen zu den Zeichenfolgenmanipulationsoperatoren finden Sie unter http://tldp.org/LDP/abs/html/string-manipulation.html

Ihre ursprüngliche Strategie würde jedoch auch funktionieren, Ihre Syntax ist nur ein bisschen anders:

> text2=$(echo $text | tr -d ' ')
> echo $text2
sometextwithspaces

Daran habe ich gar nicht gedacht, war in einer guten Stimmung, daran zu arbeiten! Tolle Antwort auch!
user3347022

11

Sie brauchen überhaupt keinen echoBefehl, sondern verwenden stattdessen Here String :

text=$(tr -d ' ' <<< "$text")

Nur aus Neugier überprüfte ich, wie viel Zeit eine so einfache Aufgabe für verschiedene Werkzeuge benötigt. Hier sind die Ergebnisse vom langsamsten zum schnellsten sortiert:

abc="some text with spaces"

$ time (for i in {1..1000}; do def=$(echo $abc | tr -d ' '); done)
0.76s user 1.85s system 52% cpu 4.976 total

$ time (for i in {1..1000}; do def=$(awk 'gsub(" ","")' <<< $abc); done)
1.09s user 2.69s system 88% cpu 4.255 total

$ time (for i in {1..1000}; do def=$(awk '$1=$1' OFS="" <<< $abc); done)
1.02s user 1.75s system 69% cpu 3.968 total

$ time (for i in {1..1000}; do def=$(sed 's/ //g' <<< $abc); done)
0.85s user 1.95s system 76% cpu 3.678 total

$ time (for i in {1..1000}; do def=$(tr -d ' ' <<< $abc); done)
0.73s user 2.04s system 85% cpu 3.244 total

$ time (for i in {1..1000}; do def=${abc// /}; done)
0.03s user 0.00s system 59% cpu 0.046 total

Der reine Shell-Betrieb ist definitiv der schnellste, was nicht verwunderlich ist, aber was wirklich beeindruckt, dass er über 100-mal schneller ist als der langsamste Befehl!


Das ist nicht immer richtig stackoverflow.com/q/14967299
Steven Penny

5

Ändern Sie einfach Ihre Textvariable wie folgt.

text=$(echo $text | tr -d ' ')

Wenn wir jedoch Steuerzeichen haben, kann dies zu Fehlern führen. Nach dem Vorschlag von Kasperd könnten wir also doppelte Anführungszeichen verwenden. So,

text="$(echo "$text" | tr -d ' ')"

wird eine bessere Version sein.


Wunderbar! Ich war soooo nah dran. Als Noob freue ich mich, dass ich die richtige Richtung eingeschlagen habe! Vielen Dank auch für die schnelle Antwort, sobald ich 8 Minuten gewartet habe, werde ich dies als Antwort einreichen!
user3347022

@ user3347022, gerne geschehen :)
Ramesh

1
Dies wird scheitern, wenn $textSteuerzeichen enthalten sind, die von der Shell interpretiert werden. text="$(echo "$text" | tr -d ' ')"
Setzen Sie

@kasperd, danke, dass du es erwähnt hast. Ich habe Ihren Vorschlag aufgenommen.
Ramesh


2

Ein Sonderfall, wenn Sie eine Variable mit einer Nummer benötigen:

Sch:

typeset -i A=B #or
typeset -i A="   23232"

ksh:

typeset -n A=B #or
typeset -n A="   23232"
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.