web-dev-qa-db-ja.com

\ dを使用したRegExは、[[を使用したif-elseステートメントでは機能しません。

次のスクリプトを書いた。後でビルドプロセスで使用されます。私の目標は、それがプレリリースかリリースかを決定することです。これをアーカイブするには、$ releaseをRegExと比較します。私のRegExが一致する場合、それはプレリリースです。一致しない場合、それはリリースです。

#/bin/bash
release="1.9.2-alpha1"
echo "$release"
if [[ "$release" =~ \d+\.\d+\.\d+[-]+.* ]];then
echo "Pre"
else
echo "Release"
fi

しかしその結果、私は常に次のようになります:

~$ bash releasescript.sh
1.9.2-alpha1
Release

バージョン:

Ubuntu 18.04.1 LTS

これを使用して editor でRegExをテストしました。私は少なくとも6時間立ち往生しているので、いくつかの助けをいただければ幸いです。

7
venter

_\d_および_\w_は POSIX正規表現 では機能しませんが、_[[:digit:]]_を使用できます

_#/bin/bash
release="1.9.2-alpha1"
echo "$release"
LANG=C # This needed only if script will be used in locales where digits not 0-9
if [[ "$release" =~ ^[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+-+ ]];then
echo "Pre"
else
echo "Release"
fi
_

私はこのスクリプトをテストしましたが、指定された$ releaseに対して「Pre」を出力しました

正規表現ビルダーをチェックアウトしました。これは、Perix互換およびJavaScript正規表現でのみ機能しますが、POSIXまたはPOSIX拡張が必要です。

作成者 @ dessert

_[0-9]_は、_[[:digit:]]_の短い代替です。文字列の先頭が一致するため、_^_を追加する必要がありますが、末尾の_.*_は不要です:_^[0-9]+\.[0-9]+\.[0-9]+-+_ –グループを使用すると、さらに短縮できます:^([0-9]+\.){2}[0-9]+-+

12
LeonidMew