2009-09-24 25 views
17

nói một chuỗi có thể giống như "a b '' c '' d", làm cách nào tôi có thể kiểm tra xem có dấu ngoặc kép và dấu cách đơn/đôi nào có trong chuỗi không?cách kiểm tra xem chuỗi có dấu cách trong bash shell

+0

Tại sao bạn muốn thực hiện việc này? Nếu bạn đang cố gắng, giả sử, hãy kiểm tra tên tệp "không hợp lệ", thay vào đó bạn có thể sửa tập lệnh để hỗ trợ tên tệp có dấu cách hoặc dấu ngoặc kép. Ví dụ. –

+0

Bạn có nói rằng bạn muốn biết rằng: a) có một trích dẫn đơn/đôi xung quanh một không gian b) một dấu nháy đơn/kép cùng với một không gian c) một cái gì đó hoàn toàn khác với điều đó? – ezpz

+0

Chỉ cần kiểm tra xem một chuỗi có bất kỳ trích dẫn nào và nếu nó có bất kỳ dấu cách nào – derrdji

Trả lời

20
case "$var" in 
    *\ *) 
      echo "match" 
      ;; 
     *) 
      echo "no match" 
      ;; 
esac 
+1

Tôi đang nitpicking, nhưng bạn không cần báo giá $ var. – Idelic

+0

@Idelic, nếu $ var bị bỏ đặt? – Will

+0

Đó là hoàn toàn ok mà không có dấu ngoặc kép, sẽ in "không phù hợp". – Idelic

1

Làm thế nào về một cách tiếp cận tương tự như:

$ A="some string"; echo $A | grep \ | wc -l 
1 
$ A="somestring"; echo $A | grep \ | wc -l 
0 

?

6
string="a b '' c '' d" 
if [ "$string" == "${string//[\' ]/}" ] 
then 
    echo did not contain space or single quote 
else 
    echo did contain space or single quote 
fi 
4

Cách di động để làm điều này là với grep:

S="a b '' c '' d" 
if echo $S | grep -E '[ "]' >/dev/null 
then 
    echo "It's a match" 
fi 

... một chút xấu xí, nhưng được bảo đảm để làm việc ở khắp mọi nơi.

+1

Với tùy chọn '-q' trong grep,'>/dev/null' không cần nữa. Một chút đẹp hơn. – Ray

21

Bạn có thể sử dụng biểu thức thông thường trong bash:

string="a b '' c '' d" 
if [[ "$string" =~ \ |\' ]] # slightly more readable: if [[ "$string" =~ (|\') ]] 
then 
    echo "Matches" 
else 
    echo "No matches" 
fi 

Edit:

Vì lý do rõ ràng ở trên, nó tốt hơn để đưa các regex trong một biến:

pattern=" |'" 
if [[ $string =~ $pattern ]] 

Và dấu ngoặc kép không cần thiết bên trong dấu ngoặc vuông kép. Chúng không thể được sử dụng ở bên phải hoặc regex được thay đổi thành một chuỗi chữ.

+0

IMO sạch nhất, đối với tôi, tôi cũng đã thêm tab nhưng trông hơi sôi nổi vì tôi phải ném đồng đô la trong đó 'pattern =" | '"$' | \ t'' - có cách nào sạch hơn không? – nhed

+1

@nhed: Trong trường hợp các ký tự đơn, bạn có thể sử dụng mẫu ký tự thay vì thay đổi ký tự ống. Điều này có thể hơi kém xấu xí: 'pattern = $ '[\' \ t] ''. Bạn cũng có thể sử dụng một biến: 'tab = $ '\ t'; pattern = "| '| $ tab" 'hoặc tab chữ (không tốt cho khả năng đọc) bằng cách nhập nó bằng cách sử dụng Ctrl-V-Tab. –

1
function foo() { 
    echo "String: $*" 
    SPACES=$(($#-1)) 
    echo "Spaces: $SPACES" 
    QUOTES=0 
    for i in $*; do 
     if [ "$i" == "'" ]; then 
      QUOTES=$((QUOTES+1)) 
     fi 
    done 
    echo "Quotes: $QUOTES" 
    echo 
} 

S="string with spaces" 
foo $S 
S="single' 'quotes" 
foo $S 
S="single '' quotes" 
foo $S 
S="single ' ' quotes" 
foo $S 

sản lượng:

String: string with spaces 
Spaces: 2 
Quotes: 0 

String: single' 'quotes 
Spaces: 1 
Quotes: 0 

String: single '' quotes 
Spaces: 2 
Quotes: 0 

String: single ' ' quotes 
Spaces: 3 
Quotes: 2 
7
[[ "$str" = "${str%[[:space:]]*}" ]] && echo "no spaces" || echo "has spaces" 
+1

lưu ý rằng điều này không phát hiện các tab hoặc dòng mới, đối với những người tò mò –

0

Tôi tự hỏi tại sao không ai đề cập đến [: space:] thiết lập. Thông thường, bạn không chỉ quan tâm đến việc phát hiện nhân vật không gian. Tôi thường cần phát hiện bất kỳ khoảng trắng nào, ví dụ: CHUYỂN HƯỚNG. Ví dụ "grep" sẽ trông giống như sau:

$ echo " " | egrep -q "[:space:]" && echo "Has no Whitespace" || echo "Has Whitespace" 
Has Whitespace 
$ echo "a" | egrep -q "[:space:]" && echo "Has no Whitespace" || echo "Has Whitespace" 
Has no Whitespace 
+0

Đối với những người quan tâm đến giải pháp này, 'grep' của tôi thông báo cho tôi rằng cú pháp của lớp ký tự là [[: space:]] chứ không phải [: space: ] '. Nếu không, giải pháp tuyệt vời! – jdferreira

+0

Vì câu hỏi được gắn thẻ "bash", không cần phải bắt đầu quá trình khác chỉ để kiểm tra chuỗi: 'case" $ String "trong * [[: space:]] *) echo" match ";; esac' –

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