私はKSHでこのようなことをしたいと思っています:
if (( $var = (foo|bar)[0-9]*$ )); then
print "variable matched regex"
fi
まったく可能ですか?
記録のために、私はSolaris 10マシンでKsh Version M-11/16/88i
を使用しています。
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
egrep(1)を使用しないのはなぜですか?すべての正規表現ユーザーが望むことができる:
if echo "$var" | egrep -s '(foo|bar)[0-9]*$' # -s means "silent"
then
...
Solarisに関する追加の注意事項:Solarisでは、マンページでegrepを確認することをお勧めします-/usr/xpg4/bin/egrep
にある別のegrepバージョンがあり、いくつかのオプションをサポートしています高度な正規表現に関しては機能が異なります。
私はsed
を使用してこのようなことをしました。どれだけいいかわかりませんが、少なくともうまくいきました^^
if [ -z "$(echo "$var" | sed -e 's/(foo|bar)[0-9]*$//')" ]; then
print "variable matched regex"
fi
私はパーティーに遅れましたが、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
とパイプを使用した「クラシック」な方法も、書き込み権限なしで機能します。