2012-12-01 39 views

Trả lời

49

Hãy thử làm điều này trong một vỏ:

s=" 3918912k" 
echo ${s//[[:blank:]]/} 

Đó sử dụng parameter expansion

[[:blank:]] là một lớp POSIX regex (loại bỏ khoảng trắng, tab ...), xem http://www.regular-expressions.info/posixbrackets.html

+0

Thay thế mở rộng tham số bên trong không phải là POSIX. Nó sẽ làm việc trong Bash (và có lẽ các shell khác mà tôi không biết), nhưng không phải trong Dash chẳng hạn. – MoonSweep

5

Bạn cũng có thể sử dụng echo để xóa không gian trống, ở đầu hoặc cuối chuỗi, nhưng cũng lặp lại khoảng trắng bên trong chuỗi.

$ myVar=" kokor iiij  ook  " 
$ echo "$myVar" 
    kokor iiij  ook  
$ myVar=`echo $myVar` 
$ 
$ # myVar is not set to "kokor iiij ook" 
$ echo "$myVar" 
kokor iiij ook 
+3

Điều này không đáng tin cậy: nếu 'myVar' chứa các ký tự đặc biệt như' * ', trình bao sẽ mở rộng nó bằng các tệp của thư mục hiện tại. –

+0

Khi #bash trên freenode luôn nói ...sử dụng nhiều dấu ngoặc kép hơn. 'echo '$ myvar" 'ngăn chặn việc mở rộng các bóng tối, v.v. – bobpaul

+0

@bobpaul, nó ngăn cản việc mở rộng các bóng tối, vv, nhưng cũng bao gồm các khoảng trắng đầu và cuối mà Mickaël định loại bỏ: ( –

1

Một cách hài hước để loại bỏ tất cả không gian từ một biến là sử dụng printf:

$ myvar='a cool variable with lots of spaces in it' 
$ printf -v myvar '%s' $myvar 
$ echo "$myvar" 
acoolvariablewithlotsofspacesinit 

Hóa ra nó hơi hiệu quả hơn myvar="${myvar// /}", nhưng không an toàn liên quan đến những đống (*) có thể xuất hiện trong chuỗi. Vì vậy, không sử dụng nó trong mã sản xuất.

Nếu bạn thực sự thực sự muốn sử dụng phương pháp này và đang thực sự lo lắng về điều globbing (và bạn thực sự cần), bạn có thể sử dụng set -f (mà vô hiệu hóa globbing hoàn toàn):

$ ls 
file1 file2 
$ myvar=' a cool variable with spaces and oh! no! there is a glob * in it' 
$ echo "$myvar" 
    a cool variable with spaces and oh! no! there is a glob * in it 
$ printf '%s' $myvar ; echo 
acoolvariablewithspacesandoh!no!thereisaglobfile1file2init 
$ # See the trouble? Let's fix it with set -f: 
$ set -f 
$ printf '%s' $myvar ; echo 
acoolvariablewithspacesandoh!no!thereisaglob*init 
$ # Since we like globbing, we unset the f option: 
$ set +f 

Tôi đăng này trả lời chỉ vì nó buồn cười, không sử dụng nó trong thực tế.

+0

Tuy nhiên trong trường hợp này, các dấu ngoặc kép –

+0

Được ngưng vào một dòng an toàn: 'myvar =" $ (set -f; printf "% s" $ myvar) "; echo" [$ myvar] "' –

3

Vì bạn đang sử dụng bash, cách nhanh nhất sẽ là:

shopt -s extglob # Allow extended globbing 
var=" lakdjsf lkadsjf " 
echo "${var//+([[:space:]])/}" 

Đó là nhanh nhất vì nó sử dụng chức năng built-in thay vì bắn lên quá trình thêm.

Tuy nhiên, nếu bạn muốn làm điều đó một cách POSIX-compliant, sử dụng sed:

var=" lakdjsf lkadsjf " 
echo "$var" | sed 's/[[:space:]]//g' 
+0

Trong một hệ vỏ không tương tác (tức là một tập lệnh), bạn cần phải 'cửa hàng-extglob' cho cái đầu tiên. –

+0

@glennjackman Tốt bắt được. Hãy xem các cập nhật của tôi. –

66

Các công cụ sed hoặc tr sẽ làm việc này cho bạn bằng cách trao đổi các khoảng trắng cho không có gì

sed 's/ //g'

tr -d ' '

Ví dụ:

$ echo " 3918912k " | sed 's/ //g' 
3918912k 
+3

Làm việc hoàn hảo. – phpguru

+0

Thật vậy, câu trả lời hiện được chấp nhận không phải là POSIX. – MoonSweep

Các vấn đề liên quan