2009-08-04 30 views
6

Sto aggiungendo una funzionalità a uno script esistente che consentirà all'utente di configurare il nome host di un sistema Linux. Le regole Sto far rispettare sono i seguenti:Come posso garantire che una stringa Bash sia alfanumerica, senza un carattere di sottolineatura?

  • deve essere compresa tra 2 e 63 caratteri
  • non devono iniziare o terminare con un trattino
  • può contenere solo caratteri alfanumerici e trattini; tutti gli altri caratteri non sono consentiti (tra cui una sottolineatura, il che significa che non posso utilizzare il simbolo \ W regex)

Ho risolto i primi due della lista, ma sto avendo difficoltà a capire come per verificare se una stringa bash contiene solo lettere, cifre e trattini. Penso di poterlo fare con una regex, ma non riesco a capire come (ho passato l'ora passata a cercare sul web e leggere le pagine man).

Sono aperto all'utilizzo di sed, grep o degli altri strumenti standard, ma non di Perl o Python.

risposta

14

sembra che questo dovrebbe farlo:

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

Trova ogni un carattere alfanumerico, poi abbinare fino a 61 caratteri alfanumerici (compresi i trattini), allora corrisponde con nessun un carattere alfanumerico. La lunghezza minima della stringa è 2, il massimo è 63. Non funziona con Unicode. Se hai bisogno che funzioni con Unicode dovrai aggiungere classi di caratteri diverse al posto di a-zA-Z0-9 ma il principio sarà lo stesso.

Credo che la corretta grep espressione che funzionerà con Unicode è:

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

Come si usa la seconda espressione con grep? Sto cercando interruttori nella pagina man ma senza successo: sto facendo eco a una stringa che dovrebbe corrispondere e non viene prodotto nulla. –

+0

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

+0

L'ho provato con questo: echo 1asdas * _- | grep -E '^ [[: alnum:]] [- [: alnum:]] {0,61} [[: alnum:]] $', senza output (anche senza virgolette singole), lol dovrei chiedere a domanda penso ...: P –

1

Questo è per l'ultimo quello che vi serve: sed -e 's/[^[:alnum:]|-]//g'

2

Questo è uno script bash testare il primo parametro se contiene solo alfanumerici o trattini. Esso "tubi" il contenuto di $ 1 nel grep:

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

Perché '^' qui rappresenta la negatività invece della prima occorrenza? – Stallman

+0

Significa "inizio della linea", quindi ogni carattere tra esso e '$' deve adattarsi al modello. –

0

si può fare con un semplice 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 
Problemi correlati