Làm cách nào để xóa khoảng trắng khỏi các biến shell?


15

Tôi đã thực hiện như sau tại dòng lệnh:

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

Tôi đang cố gắng sử dụng tr -d ' 'để xóa các khoảng trắng và có kết quả:

namewithspace

Tôi đã thử một vài thứ như:

text=echo $text | tr -d ' '

Không có may mắn cho đến nay hy vọng bạn dân gian tuyệt vời có thể giúp đỡ!

Câu trả lời:


45

Trong Bash, bạn có thể sử dụng thao tác chuỗi dựng sẵn của Bash. Trong trường hợp này, bạn có thể làm:

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

Để biết thêm về các toán tử thao tác chuỗi, hãy xem http://tldp.org/LDP/abs/html/opes-manipulation.html

Tuy nhiên, chiến lược ban đầu của bạn cũng sẽ hoạt động, cú pháp của bạn chỉ là một chút:

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

Tôi thậm chí không nghĩ về điều đó, trong một tâm trạng làm việc này! Câu trả lời tuyệt vời là tốt!
dùng3347022

11

Bạn hoàn toàn không cần echolệnh, chỉ cần sử dụng Chuỗi ở đây :

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

Chỉ vì tò mò tôi đã kiểm tra xem một công việc tầm thường như vậy mất bao nhiêu thời gian cho các công cụ khác nhau. Dưới đây là kết quả được sắp xếp từ chậm nhất đến nhanh nhất:

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

Hoạt động vỏ thuần túy chắc chắn là nhanh nhất không có gì đáng ngạc nhiên, nhưng điều thực sự ấn tượng là nó nhanh hơn 100 lần so với lệnh chậm nhất!


Điều đó không phải lúc nào cũng đúng stackoverflow.com/q/14967299
Steven Penny

5

Chỉ cần sửa đổi biến văn bản của bạn như dưới đây.

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

Tuy nhiên, nếu chúng ta có nhân vật điều khiển thì điều này có thể bị phá vỡ. Vì vậy, theo đề nghị của Kasperd, chúng tôi có thể có hai trích dẫn xung quanh nó. Vì thế,

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

sẽ là một phiên bản tốt hơn.


Tuyệt vời! Tôi đã rất gần gũi. Là một người mới, tôi hài lòng, tôi đã đi đúng hướng! Cảm ơn bạn đã phản hồi nhanh chóng, ngay sau khi tôi đợi 8 phút, tôi sẽ gửi câu trả lời này!
dùng3347022

@ user3347022, bạn được chào đón :)
Ramesh

1
Điều này sẽ phá vỡ nếu $textchứa các ký tự điều khiển, sẽ được giải thích bởi shell. Tốt hơn nên đặt một số trích dẫn kép trong đó:text="$(echo "$text" | tr -d ' ')"
kasperd

@kasperd, cảm ơn vì đã đề cập đến nó. Tôi đã kết hợp đề nghị của bạn.
Ramesh


2

trường hợp đặc biệt khi bạn cần một biến có số:

sh:

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

ksh:

typeset -n A=B #or
typeset -n A="   23232"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.