2017-02-07 9 views
1

私はこのpreg_match_allはBASHに相当しますか?

foo:collection:indexation [options] [--] <text> <text_1> <text_2> <text_3> <text_4> 

のような文字列を持っていると私は構文が正しい

["text", "text_1", "text_2", "text_3", "text_4"] 
であれば、私は確認するために、これを取得するために分割することができ、配列や文字列を取得するには、bashの正規表現を使用したいです

COMMAND_OUTPUT=$($COMMAND_HELP) 
# get the output of the help 
# regex 
ARGUMENT_REGEX="<([^>]+)>" 
GOOD_REGEX="[a-z-]" 

# get all the arguments 
while [[ $COMMAND_OUTPUT =~ $ARGUMENT_REGEX ]]; do 
    ARGUMENT="${BASH_REMATCH[1]}" 
    # bad syntax 
    if [[ ! $ARGUMENT =~ $GOOD_REGEX ]]; then 
     echo "Invalid argument '$ARGUMENT' for the command $FILE" 
     echo "Must only use characters [a-z:-]" 
     exit 5 
    fi 
done 

しかし、私はいつも最初のマッチを得るため、しばらくは適切ではないようです:

私はこれを行うことを試みました。

この正規表現のすべての一致を取得するにはどうすればよいですか?

ありがとうございます!

答えて

1

regexpに対して同じ入力文字列をテストするたびにループが機能しません。以前の反復と一致した後にスキャンを開始する必要があるかどうかはわかりません。次のテストを行う前に、以前の一致までの文字列の部分を削除する必要があります。

もっと簡単な方法は、grep -oを使用してすべての一致を取得することです。

$COMMAND_HELP | grep -o "$ARGUMENT_REGEX" | while read ARGUMENT; do 
    if [[ ! $ARGUMENT =~ $GOOD_REGEX ]]; then 
     echo "Invalid argument '$ARGUMENT' for the command $FILE" 
     echo "Must only use characters [a-z:-]" 
     exit 5 
    fi 
done 
1

Bashにはこれが直接用意されていませんが、わずかな変更で同様の効果が得られます。

string='foo...' 
re='<([^>]+)>' 

while [[ $string =~ $re(.*) ]]; do 
    string=${BASH_REMATCH[2]} 

    # process as before 
done 

これは、我々はまた、と正規表現の後の文字列ですべてをしたい正規表現にマッチします。 $stringはすべての反復でafter-our-regex部分だけを割り当てて短縮しています。最後の反復では、${BASH_REMATCH[2]}は空になるため、ループは終了します。

関連する問題