Kabuk değişkenlerinden boşlukları nasıl kaldırabilirim?


15

Komut satırında aşağıdakileri yaptım:

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

tr -d ' 'Boşlukları kaldırmak için kullanmak çalışıyorum ve bir sonucu var:

namewithspace

Gibi birkaç şey denedim:

text=echo $text | tr -d ' '

Şimdiye kadar hayır şans umarım harika halk yardımcı olabilir!

Yanıtlar:


45

Bash'te, Bash'in yerleşik dize manipülasyonunu kullanabilirsiniz. Bu durumda şunları yapabilirsiniz:

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

Dize düzenleme işleçleri hakkında daha fazla bilgi için bkz. Http://tldp.org/LDP/abs/html/string-manipulation.html

Ancak, orijinal stratejiniz de işe yarar, sözdiziminiz biraz kapalı:

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

Ben bile düşünmedim, bu üzerinde çalışan bir tr havasında oldu! Büyük cevap da!
user3347022

11

echoKomuta ihtiyacınız yok , bunun yerine Here String kullanın:

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

Sadece merak için, bu tür önemsiz bir görevin farklı araçlar için ne kadar zaman aldığını kontrol ettim. En yavaştan en hızlıya doğru sıralanan sonuçlar şunlardır:

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

Saf kabuk operasyonu kesinlikle şaşırtıcı olmayanın en hızlısıdır, ancak en etkileyici olandan en yavaş 100 kat daha hızlı olması gerçekten etkileyici olan şeydir!


Bu her zaman doğru değildir stackoverflow.com/q/14967299
Steven Penny

5

Metin değişkeninizi aşağıdaki gibi değiştirmeniz yeterlidir.

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

Ancak, kontrol karakterlerimiz varsa bu kırılabilir. Yani, Kasperd'in önerisine göre, etrafında çift tırnak olabilir. Yani,

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

daha iyi bir sürüm olacak.


Olağanüstü! Çok yakındım. Bir çaylak olarak doğru yöne gittiğim için memnunum! Hızlı yanıt için de teşekkür ederim, 8 dakika beklediğimde bunu cevap olarak göndereceğim!
user3347022

@ user3347022, rica ederim :)
Ramesh

1
Bu takdirde de bozulur $textkabuk tarafından yorumlanır kontrol karakterleri içerir. Orada daha iyi bazı çift tırnak koymak:text="$(echo "$text" | tr -d ' ')"
kasperd

@kasperd, bahsettiğiniz için teşekkürler. Önerinizi dahil ettim.
Ramesh


2

sayıya sahip bir değişkene ihtiyacınız olduğunda özel bir durum:

sh:

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

ksh:

typeset -n A=B #or
typeset -n A="   23232"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.