2009-08-04 16 views
6

Kullanıcının bir Linux sisteminin ana bilgisayar adını yapılandırmasına izin veren mevcut bir betiğe bir özellik ekliyorum. aşağıdaki gibi ben zorlama ediyorum kurallar şunlardır:Altyazı içermeyen bir Bash dizesinin alfanümerik olmasını nasıl sağlayabilirim?

  • başlatmak veya
  • yalnızca alfasayısal karakterler ve tire içerebilir tire ile sona olmamalıdır
  • uzunluğu 2 ile 63 karakter olmalı; Diğer tüm karakterler ben listedeki ilk iki çözdük

(ı \ W regex sembolünü kullanmak anlamına gelir bir alt çizgi dahil) izin verilmez, ama ben dışarı nasıl endam sorun yaşıyorum Bir bash dizesinin yalnızca harf, rakam ve tire içerdiğini kontrol etmek için kullanılır. Bunu bir regex ile yapabileceğimi düşünüyorum, ama nasıl olduğunu anlamakta zorlanıyorum (geçen saati web'de arama yaparak ve man sayfaları okuyarak geçirdim).

Sed, grep veya diğer standart araçlardan herhangi birine, ancak Perl veya Python kullanmaya açık değilim.

cevap

14

bunu yapmak gerektiğini gibi görünüyor:

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

Match herhangi bir alfanümerik karakter, ardından, (tire dahil) 61 alfanümerik karaktere kadar maç herhangi bir alfasayısal karakter eşleşir. Minimum dize uzunluğu 2, maksimum 63'tür. Unicode ile çalışmaz. Unicode ile çalışmak için ihtiyacınız varsa, a-zA-Z0-9 yerine farklı karakter sınıfları eklemeniz gerekir, ancak ilke aynı olacaktır. Ben Unicode ile çalışacak doğru grep ifadesini inanıyoruz

geçerli: Bu içerip içermediğini ilk parametreyi test bir bash script sed -e 's/[^[:alnum:]|-]//g'

+1

ile yapabilirsiniz? Adam sayfasında anahtarlar arıyorum ama başarıya ulaşmadım: Eşleşmesi gereken bir diziyi yankılanıyorum ve hiçbir şey çıkmıyor. –

+0

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

+0

Bunu denedim: echo 1asdas * _- | grep -E '^ [[: alnum:]] [- [: alnum:]] {0,61} [[: alnum:]] $', çıkışsız (ayrıca tek tırnaksız), lol soru sanırım ...: P –

1

Bu İhtiyacınız sonuncusu içindir sadece alfanümerik veya tireler. Bu "boru" grep içine 1 $ içeriği:

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

:

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

Neden '^' ilk meydana gelme yerine olumsuzluğu temsil ediyor? – Stallman

+0

Bu "satırın başlangıcı" anlamına gelir, bu yüzden onun arasındaki her karakterle "$" kalıba uymalıdır. –

0

sadece bash Eğer grep ile ikinci ifadeyi nasıl kullanırım

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 
İlgili konular