2009-08-04 23 views
6

私は、ユーザーがLinuxシステムのホスト名を設定できるようにする既存のスクリプトに機能を追加しています。次のように私は強制てるのルールは以下のとおりです。Bash文字列を英数字で、アンダースコアなしにするにはどうすればよいですか?

  • 開始または
  • は英数字のみと、ハイフンを含めることができ、ハイフンで終わってはいけません
  • 長く、2〜63文字でなければなりません。他のすべての文字は許されません(\ W正規表現を使用できないことを意味するアンダースコアを含む)

私はリストの最初の2つを解決しましたが、 bash文字列に文字、数字、ハイフンのみが含まれているかどうかを確認します。私は正規表現でこれを行うことができると思うが、私はどのようにして(Webを検索してマニュアルページを読むのに過去の時間を費やしていたのか)調べるのに困っている。

私はsed、grep、またはその他の標準ツールを使用できますが、PerlやPythonは使用できません。

答えて

14

が、これはそれを行うべきように思える:

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

マッチ任意の1つの英数字、その後、いずれかの英数字にマッチそして、(ハイフンを含む)61文字までの英数字を一致させます。最小文字列の長さは2、最大値は63です。Unicodeでは機能しません。 Unicodeで動作する必要がある場合は、a-zA-Z0-9の代わりに異なる文字クラスを追加する必要がありますが、原則は同じです。私は、Unicodeで動作します正しいgrep式を信じる

は次のようになります。これは、それが含まれているかどうかを最初のパラメータをテストするbashスクリプトがあるsed -e 's/[^[:alnum:]|-]//g'

+1

でそれを行うことができますか?私はマニュアルページのスイッチを探していますが、成功しません。一致する文字列を出力していて何も出力されません。 –

+0

@Montecristo: 'grep -E'または' egrep' – Welbog

+0

私はこれを試しました:echo 1asdas * _- | grep -E '^ [[:alnum:]] [ - :alnum:]] {0:alnum:]] $'、出力なし(一重引用符も含まない)、lol質問:P –

1

これはあなたが必要とする最後のものです英数字またはハイフンのみです。それは「パイプ」はgrepに$ 1の内容:

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

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

なぜ '^'が最初の出現の代わりに否定性を表すのか? – Stallman

+0

"行の先頭"を意味するので、 '$'の間のすべての文字はパターンに収まる必要があります。 –

0

あなただけのbashあなたがgrepを有する第2の式を使用するにはどうすればよい

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 
関連する問題