2009-08-04 16 views
6

Dodaję funkcję do istniejącego skryptu, który pozwoli użytkownikowi skonfigurować nazwę hosta systemu Linux. Zasady ja wymuszające są następujące:Jak mogę zapewnić ciąg alfanumeryczny bez znaku podkreślenia?

  • musi wynosić między 2 a 63 znaków
  • nie może rozpoczynać się ani kończyć myślnikiem
  • może zawierać tylko znaki alfanumeryczne i łączniki; wszystkie inne znaki są niedozwolone (w tym podkreślenie, co oznacza, że ​​nie mogę używać symbolu regex \ W).

Rozwiązałem dwa pierwsze na liście, ale mam problem z ustaleniem, w jaki sposób aby sprawdzić, czy łańcuch bash zawiera tylko litery, cyfry i łączniki. Myślę, że mogę to zrobić za pomocą regexu, ale mam problem z ustaleniem, w jaki sposób (spędziłem ostatnią godzinę przeszukując sieć i czytając strony man).

Jestem otwarty na użycie sed, grep lub dowolnego innego standardowego narzędzia, ale nie Perl czy Python.

Odpowiedz

14

Wygląda to powinno wystarczyć:

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

dało żadnych jeden znak alfanumeryczny, a następnie dopasować się do 61 znaków alfanumerycznych (łącznie z myślnikami), a następnie dopasować dowolny znak alfanumeryczny. Minimalna długość ciągu to 2, maksymalna to 63. Nie działa z Unicode. Jeśli potrzebujesz go do pracy z Unicode, musisz dodać różne klasy znaków w miejsce a-zA-Z0-9, ale zasada będzie taka sama.

wierzę poprawnego grep wyrażenie, które będzie współpracować z Unicode jest:

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

Jak używać drugie wyrażenie z grep? Poszukuję przełączników na stronie podręcznika, ale bez powodzenia: powtarzam ciąg znaków, który powinien się zgadzać i nic nie jest wyprowadzane. –

+0

@Montecristo: 'grep -E' lub' egrep' – Welbog

+0

Próbowałem go z tym: echo 1asdas * _- | grep -E '^ [[:: alnum:]] [- [: alnum:]] {0,61} [[: alnum:]] $', bez danych wyjściowych (również bez pojedynczych cudzysłowów), lol powinienem zapytać pytanie myślę, że ...: P –

1

To dla ostatniego trzeba: sed -e 's/[^[:alnum:]|-]//g'

2

Jest to skrypt bash testuje pierwszy parametr, czy zawiera on tylko znaki alfanumeryczne lub łączniki. It "rury" zawartość $ 1 język grep:

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

Dlaczego "^" tutaj reprezentuje ujemność zamiast pierwszego wystąpienia? – Stallman

+0

To znaczy "początek linii", więc każda postać pomiędzy nim a '$' musi pasować do wzorca. –

0

można to zrobić tylko z 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 
Powiązane problemy