2009-08-04 9 views
6

Tôi đang thêm một tính năng vào tập lệnh hiện có sẽ cho phép người dùng định cấu hình tên máy chủ của hệ thống Linux. Các quy tắc tôi đang thực thi như sau:Làm cách nào để đảm bảo chuỗi Bash là chữ và số, không có dấu gạch dưới?

  • Phải là từ 2 đến 63 ký tự dài
  • Phải không bắt đầu hoặc kết thúc với một dấu gạch ngang
  • Chỉ có thể chứa các ký tự chữ và số, và dấu gạch nối; tất cả các ký tự khác không được phép (bao gồm dấu gạch dưới, có nghĩa là tôi không thể sử dụng biểu tượng regex \ W)

Tôi đã giải quyết hai câu hỏi đầu tiên trong danh sách, nhưng tôi đang gặp khó khăn khi tìm hiểu cách để kiểm tra xem chuỗi bash chỉ chứa chữ cái, chữ số và dấu gạch nối. Tôi nghĩ rằng tôi có thể làm điều này với một regex, nhưng tôi đang gặp khó khăn trong việc tìm ra cách (Tôi đã dành thời gian trong quá khứ tìm kiếm trên web và đọc các trang của người đàn ông).

Tôi đang mở để sử dụng sed, grep hoặc bất kỳ công cụ chuẩn nào khác, chứ không phải Perl hoặc Python.

Trả lời

14

Có vẻ như thế này phải làm điều đó:

^[a-zA-Z0-9][-a-zA-Z0-9]{0,61}[a-zA-Z0-9]$ 

trận đấu bất kỳ một ký tự chữ và số, sau đó kết hợp lên đến 61 ký tự chữ và số (bao gồm cả dấu gạch nối), sau đó kết hợp bất kỳ một ký tự chữ và số. Độ dài chuỗi tối thiểu là 2, tối đa là 63. Nó không hoạt động với Unicode. Nếu bạn cần nó để làm việc với Unicode, bạn sẽ cần phải thêm các lớp nhân vật khác nhau thay cho a-zA-Z0-9 nhưng nguyên tắc sẽ giống nhau.

Tôi tin rằng grep biểu đúng khi cho rằng sẽ làm việc với Unicode là:

^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$ 
+1

Làm thế nào để bạn sử dụng biểu thức thứ hai với grep? Tôi đang tìm kiếm các thiết bị chuyển mạch trong trang người đàn ông nhưng không thành công: Tôi đang lặp lại một chuỗi nên khớp và không có đầu ra nào. –

+0

@Montecristo: 'grep -E' hoặc' egrep' – Welbog

+0

Tôi đã thử nó với điều này: echo 1asdas * _- | grep -E '^ [[: alnum:]] [- [: alnum:]] {0,61} [[: alnum:]] $', không có đầu ra (cũng không có dấu nháy đơn), lol tôi nên hỏi câu hỏi tôi nghĩ ...: P –

1

này là dành cho người cuối cùng bạn cần: sed -e 's/[^[:alnum:]|-]//g'

2

Đây là một kịch bản bash kiểm tra các tham số đầu tiên cho dù nó chứa chỉ chữ và số hoặc dấu gạch nối. Nó "ống" các nội dung của $ 1 vào grep:

#!/bin/bash 
if grep '^[-0-9a-zA-Z]*$' <<<$1 ; 
    then echo ok; 
    else echo ko; 
fi 
+0

Tại sao '^' ở đây thể hiện sự tiêu cực thay vì sự xuất hiện đầu tiên? – Stallman

+0

Nó có nghĩa là "bắt đầu của dòng", do đó, mỗi ký tự giữa nó và '$' phải phù hợp với mô hình. –

0

bạn có thể làm điều đó với chỉ bash

string="-sdfsf" 
length=${#string} 
if [ $length -lt 2 -o $length -gt 63 ] ;then 
    echo "length invalid" 
    exit 
fi 
case $string in 
    -*) echo "not ok : start with hyphen";exit ;;  
    *-) echo "not ok : end with hyphen";exit ;; 
    *[^a-zA-Z0-9-]*) echo "not ok : special character";exit;; 
esac