Come rimuovo gli spazi dalle variabili della shell?


15

Ho fatto quanto segue alla riga di comando:

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

Sto cercando di utilizzare tr -d ' 'per rimuovere gli spazi e avere un risultato di:

namewithspace

Ho provato alcune cose come:

text=echo $text | tr -d ' '

Nessuna fortuna fino ad ora, quindi spero che tu possa aiutare una gente meravigliosa!

Risposte:


45

In Bash, puoi usare la manipolazione delle stringhe integrata di Bash. In questo caso, puoi fare:

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

Per ulteriori informazioni sugli operatori di manipolazione delle stringhe, vedere http://tldp.org/LDP/abs/html/string-manipulation.html

Tuttavia, anche la tua strategia originale funzionerebbe, la tua sintassi è solo un po 'fuori:

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

Non ci avevo nemmeno pensato, ero di umore lavorando su questo! Ottima risposta anche!
user3347022

11

Non è necessario alcun echocomando, basta usare Here String invece:

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

Solo per curiosità ho verificato quanto tempo impiega un compito così banale per diversi strumenti. Ecco i risultati ordinati dal più lento al più veloce:

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

L'operazione shell pura è sicuramente la più veloce, ciò che non sorprende, ma ciò che è davvero impressionante è che è oltre 100 volte più veloce del comando più lento!


Questo non è sempre vero stackoverflow.com/q/14967299
Steven Penny,

5

Basta modificare la variabile di testo come di seguito.

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

Tuttavia, se abbiamo personaggi di controllo, questo potrebbe rompersi. Quindi, come suggerito da Kasperd, potremmo avere doppie virgolette attorno ad esso. Così,

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

sarà una versione migliore.


Meraviglioso! Ero davvero vicino. Sono felice di essere diretto nella direzione giusta! Grazie anche per la risposta rapida, non appena avrò aspettato 8 minuti, lo invierò come risposta!
user3347022

@utente3347022, prego :)
Ramesh,

1
Questo si interromperà se $textcontiene caratteri di controllo, che sarebbero interpretati dalla shell. Meglio mettere alcune doppie virgolette:text="$(echo "$text" | tr -d ' ')"
kasperd,

@kasperd, grazie per averlo menzionato. Ho incorporato il tuo suggerimento.
Ramesh,


2

un caso speciale quando è necessario per una variabile che ha un numero:

sh:

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

ksh:

typeset -n A=B #or
typeset -n A="   23232"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.