kshでの正規表現の一致

kshでの正規表現の一致

KSHで次のことをしたいと思います。

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

可能ですか?

参考までに、私はVersion M-11/16/88iSolaris 10システムでKshを使用しています。

答え1

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

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

内部に手動、「条件式」の下の括弧内の内容を探し、「ファイル名の生成」の下のパターン構文を見つけます。

答え2

globモードで使用すると効果がある可能性caseがあります。複合パターンは、*(pattern-list)「与えられたパターンのゼロ個以上の一致」を意味し、@(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

答え3

なぜ使用しないのですか?エグレフ(1)?正規表現ユーザーが期待できるすべてを提供します。

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

Solarisに関する追加の注意:Solarisの場合は、マンページを確認することをお勧めします。エグレフ-もう一つあります。エグレフバージョンは/usr/xpg4/bin/egrepより多くのオプションをサポートし、高度な正規表現の観点からさまざまな機能を提供します。

答え4

パーティーに遅れていることはわかりますが、これは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
    ...

<<<演算子で使用されるこの技術ここに文字列。ただし、以下も追加する必要があります。警告するstderr:ここにある文字列をどこかの一時ファイルに書き込む必要があるため、読み取り専用環境では機能しません(つまり、見苦しいエラーメッセージが表示されます)。私が知っている限り、echoパイプを使用する「クラシック」方式は書き込み権限なしで動作します。

関連情報