web-dev-qa-db-ja.com

kshの正規表現に一致

私はKSHでこのようなことをしたいと思っています:

if (( $var = (foo|bar)[0-9]*$ )); then
    print "variable matched regex"
fi

まったく可能ですか?

記録のために、私はSolaris 10マシンでKsh Version M-11/16/88iを使用しています。

7
rahmu

Kshには正規表現がありますが、通常の構文にはありません(- Solaris 10のバージョン にはありません)。

if [[ $var = *@(foo|bar)*([0-9]) ]]; then …

manual で、「条件式」の下で括弧の中に何があるかを確認し、「ファイル名の生成」の下でパターン構文を確認します。

グロブパターンでcaseを使用するとうまくいく場合があります。複合パターン*(pattern-list)は「指定されたパターンの0回以上の出現に一致」を意味し、@(pattern-list)は「指定されたパターンの1つに一致」を意味します。

matcher() {
  typeset var="$1"
  case "$var" in
    *@(foo|bar)*([0-9])) print "$var matched" ;;
    *) print "$var did not match" ;;
  esac
}

for var in foo bar baz foo123 abc_foo132 abc_foo123z bar1 1bar1 1bar1a; do 
  matcher "$var"
done

出力:

foo matched
bar matched
baz did not match
foo123 matched
abc_foo132 matched
abc_foo123z did not match
bar1 matched
1bar1 matched
1bar1a did not match
4
glenn jackman

egrep(1)を使用しないのはなぜですか?すべての正規表現ユーザーが望むことができる:

 if echo "$var" | egrep -s '(foo|bar)[0-9]*$'    # -s means "silent"
  then
    ...

Solarisに関する追加の注意事項:Solarisでは、マンページでegrepを確認することをお勧めします-/usr/xpg4/bin/egrepにある別のegrepバージョンがあり、いくつかのオプションをサポートしています高度な正規表現に関しては機能が異なります。

2
ktf

私はsedを使用してこのようなことをしました。どれだけいいかわかりませんが、少なくともうまくいきました^^

if [ -z "$(echo "$var" | sed -e 's/(foo|bar)[0-9]*$//')" ]; then
    print "variable matched regex"
fi
1
rahmu

私はパーティーに遅れましたが、ktfの解決策の代わりに:

 if echo "$var" | egrep -s '(foo|bar)[0-9]*$'    # -s means "silent"
  then
    ...

あなたも使うかもしれません

 if grep -q '(foo|bar)[0-9]*$' <<< "$var"        # -q means "quiet" ;-)
  then
    ...

<<<演算子を使用したこの手法は、herestringと呼ばれます。ただし、warningも追加する必要があります。これは、読み取り専用環境では機能しません(つまり、stderrに醜いエラーメッセージが表示されます)。どこかに書き込まれるファイル。私の知る限り、echoとパイプを使用した「クラシック」な方法も、書き込み権限なしで機能します。

0
syntaxerror