Bagaimana cara menghapus spasi dari variabel shell?

15

Saya telah melakukan hal berikut di baris perintah:

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

Saya mencoba menggunakan tr -d ' 'untuk menghapus spasi dan memiliki hasil:

namewithspace

Saya sudah mencoba beberapa hal seperti:

text=echo $text | tr -d ' '

Tidak ada keberuntungan sejauh ini jadi semoga Anda orang-orang hebat dapat membantu!

pengguna3347022
sumber

Jawaban:

45

Di Bash, Anda dapat menggunakan manipulasi string bawaan Bash. Dalam hal ini, Anda dapat melakukan:

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

Untuk lebih lanjut tentang operator manipulasi string, lihat http://tldp.org/LDP/abs/html/string-manipulation.html

Namun, strategi orisinal Anda juga akan berfungsi, sintaks Anda sedikit berbeda:

> text2=$(echo $text | tr -d ' ')
> echo $text2
sometextwithspaces
Steven D
sumber
Aku bahkan tidak memikirkan itu, sedang tidak enak mengerjakan ini! Jawaban yang bagus juga!
user3347022
11

Anda tidak perlu echoperintah sama sekali, cukup gunakan Here String sebagai gantinya:

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

Hanya untuk rasa ingin tahu, saya memeriksa berapa banyak waktu yang diperlukan untuk tugas sepele untuk alat yang berbeda. Berikut adalah hasil yang diurutkan dari yang paling lambat ke yang paling cepat:

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

Operasi shell murni jelas merupakan yang tercepat yang tidak mengejutkan, tetapi yang benar-benar mengesankan adalah lebih dari 100 kali lebih cepat daripada perintah yang paling lambat!

jimmij
sumber
Itu tidak selalu benar stackoverflow.com/q/14967299
Steven Penny
5

Cukup modifikasi variabel teks Anda seperti di bawah ini.

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

Namun, jika kita memiliki karakter kontrol, ini mungkin rusak. Jadi, sesuai saran Kasperd, kita bisa memiliki tanda kutip ganda di sekitarnya. Begitu,

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

akan menjadi versi yang lebih baik.

Ramesh
sumber
Hebat! Aku sangat dekat. Sebagai noob saya senang saya menuju ke arah yang benar! Terima kasih atas tanggapan yang cepat juga, segera setelah saya menunggu 8 menit saya akan mengirimkan ini sebagai jawabannya!
user3347022
@ user3347022, selamat datang :)
Ramesh
1
Ini akan rusak jika $textberisi karakter kontrol, yang akan ditafsirkan oleh shell. Lebih baik masukkan tanda kutip ganda di sana:text="$(echo "$text" | tr -d ' ')"
kasperd
@kasperd, terima kasih sudah menyebutkannya. Saya telah memasukkan saran Anda.
Ramesh
4
$ sed 's. ..g' <<< $text
namewithspace
Steven Penny
sumber
2

kasus khusus ketika Anda membutuhkan variabel yang memiliki nomor:

SH:

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

ksh:

typeset -n A=B #or
typeset -n A="   23232"
Tagar
sumber