2013-05-19 27 views
9

Thử dùng fish shell, vì vậy tôi đang dịch các hàm bash của mình. Vấn đề là trong một trường hợp, tôi đang sử dụng bash regexes để kiểm tra xem một chuỗi có khớp với regex hay không. Tôi không thể tìm ra cách dịch nó thành cá.unix: cách để biết chuỗi có khớp với regex

Here là ví dụ của tôi.

if [[ "$arg" =~ ^[0-9]+$ ]] 
... 
  • Tôi nhìn vào sed, nhưng tôi không thấy một cách để có được nó để thiết lập trạng thái thoát của nó dựa trên việc các trận đấu regex.
  • Tôi đã xem xét ủy quyền cho Ruby, nhưng một lần nữa, nhận trạng thái thoát được đặt dựa trên kết quả khớp yêu cầu thực hiện điều này thực sự xấu xí (xem bên dưới).
  • Tôi đã xem xét ủy quyền trở lại bash, nhưng mặc dù cố gắng có thể ba hoặc bốn cách, không bao giờ có điều đó để phù hợp.

Vì vậy, có cách nào trong * nix để kiểm tra xem chuỗi có khớp với regex không, vì vậy tôi có thể thả chuỗi đó vào điều kiện?


Dưới đây là những gì tôi có hiện hoạt động, nhưng mà tôi không hài lòng với:

# kill jobs by job number, or range of job numbers 
# example: k 1 2 5 
# example: k 1..5 
# example: k 1..5 7 10..15 
# example: k 1-5 7 10-15 
function k 
    for arg in $argv 
    if ruby -e "exit ('$arg' =~ /^[0-9]+\$/ ? 0 : 1)" 
     kill -9 %$arg 
    else 
     set _start (echo "$arg" | sed 's/[^0-9].*$//') 
     set _end (echo "$arg" | sed 's/^[0-9]*[^0-9]*//') 

     for n in (seq $_start $_end) 
     kill -9 %"$n" 
     end 
    end 
    end 
end 

Trả lời

9

Cách thông thường là sử dụng grep:

if echo "$arg" | grep -q -E '^[0-9]+$' 
    kill -9 %$arg 
+0

Cảm ơn bạn! Tôi thậm chí không nhận ra có lá cờ -E (luôn được sử dụng cho điều đó), cờ '-q', hoặc nó sẽ đặt trạng thái thoát của nó dựa trên việc nó có khớp hay không. –

+0

Cài đặt GNU grep để sử dụng -P (Perl regexp syntax) trên OS X. – xixixao

1

Tôi sẽ kiện cử chỉ sử dụng phụ đề string match được xây dựng trong

if string match -r -q '^[0-9]+$' $arg 
    echo "number!" 
else 
    echo "not a number" 
end 
Các vấn đề liên quan