変数がPOSIXシェルの正規表現と一致することを確認しようとしています。ところがこれが思ったより難しいと思います。変数が有効なサイズ文字列(10Mや6Gなど)であることを確認しようとしています。
if echo $var | grep -Eq '^\d+[MG]$';
then
echo "match"
else
echo "no match"
fi
これは私が試したことですが、変数に正しい文字列が含まれていても、何らかの理由で一致しませんか?理由をご存知ですか?
答え1
GNUは、grep
基本、拡張(ERE)、およびPerl(PCRE)の3種類の正規表現をサポートしています。 GNUでは、grep
EREは基本機能以上の機能を提供していませんが、一部の文字にはプラス記号などの特別な意味があります。ソース:マニュアルページ。
\d
EREでは特別な意味はありません。ただの役割にすぎませんd
。数字を表現するには、[[:digit:]]
or oldを使用してください。 (彼とは異なる文字エンコーディングが[0-9]
あるのだろうか?)[0-9]
[[:digit:]]
ただし、式をPCREとして使用できます。
if echo $var | grep -Pq '^\d+[MG]$';
then
echo "match"
else
echo "no match"
fi
この-P
オプションは該当しません-E
。
POSIXのように見えます。grep
PCREはサポートされていません。しかし、まだPOSIX ERE定義を読んでいません。