2008-11-27 4 views
7

Giả sử một biến chứa dấu cách, dòng mới, và các tab theo sau một số văn bản, tại sao thực hiện điều này:loại bỏ khoảng trắng từ bash biến

${var#"${var%%[![:space:]]*}"} # strip var of everything 
           # but whitespace 
           # then remove what's left 
           # (i.e. the whitespace) from var 

loại bỏ các khoảng trắng và rời khỏi văn bản, nhưng điều này:

${var##[:space:]*} # strip all whitespace from var 

không?

Trả lời

26

Nếu tôi đặt var=" This is a test ", cả đề xuất của bạn sẽ không hoạt động; chỉ là nội dung hàng đầu bị xóa. Tại sao không sử dụng chức năng thay thế mà loại bỏ tất cả các lần xuất hiện của khoảng trắng và không chỉ là người đầu tiên: Câu trả lời

${var//[[:space:]]} 
4

[: space:] là một lớp nhân vật. Nó chỉ hợp lệ nếu nó được lồng trong một tập hợp [] khác.

+0

Cảm ơn - Tôi không biết rằng lớp nhân vật cần dấu ngoặc lồng nhau. – MCS

+0

@MCS - Đây là tài liệu trong regex (7) ("man 7 regex" để đọc nó). Hầu hết các triển khai regex hiện đại bao gồm hỗ trợ cho các lớp nhân vật POSIX được đặt tên, vì vậy bạn có thể đọc về chúng trong trang người đàn ông perlre, ví dụ, là tốt. – converter42

0

gì về $ (echo $ var)

> a=" 123 456 " ; a2="$(echo $a)" ; echo "a=\"${a}\" a2=\"${a2}\"" 
a=" 123 456 " a2="123 456"