Como eu removo espaços de variáveis do shell?

14

Eu fiz o seguinte na linha de comando:

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

Estou tentando usar tr -d ' ' para remover os espaços e ter um resultado de:

namewithspace

Eu tentei algumas coisas como:

text=echo $text | tr -d ' '

Sem sorte até agora, espero que vocês, pessoas maravilhosas, possam ajudar!

    
por user3347022 20.09.2014 / 18:30

5 respostas

45

No Bash, você pode usar a manipulação de strings do Bash. Nesse caso, você pode fazer:

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

Para saber mais sobre os operadores de manipulação de string, consulte o link

No entanto, sua estratégia original também funcionaria, sua sintaxe está um pouco errada:

> text2=$(echo $text | tr -d ' ')
> echo $text2
sometextwithspaces
    
por 20.09.2014 / 18:35
10

Você não precisa do comando echo , apenas use Aqui String em vez disso:

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

Apenas por curiosidade, verifiquei quanto tempo uma tarefa tão trivial exige para diferentes ferramentas. Aqui estão os resultados classificados de mais lentos a mais rápidos:

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

A operação de shell puro é definitivamente o mais rápido, o que não é surpreendente, mas o que é realmente impressionante é que ele é 100 vezes mais rápido que o comando mais lento!

    
por 20.09.2014 / 22:29
6

Apenas modifique sua variável de texto como abaixo.

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

No entanto, se tivermos caracteres de controle, isso pode quebrar. Então, de acordo com a sugestão de Kasperd, poderíamos ter aspas duplas em torno dele. Então,

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

será uma versão melhor.

    
por 20.09.2014 / 18:34
4
$ sed 's. ..g' <<< $text
namewithspace
    
por 20.09.2014 / 23:28
2

um caso especial quando você precisa de uma variável que tenha um número:

sh:

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

ksh:

typeset -n A=B #or
typeset -n A="   23232"
    
por 10.01.2015 / 01:33