私はやや自由な形式のcsvファイルで作業しており、コスト項目を効率的に見つける必要があります。より良い解決策は、各行の特定の列数をテストすることです。次のことを試みましたが(GNU bash、バージョン5.0.17)は機能しません(「ドルの金額」は返されません)。
#!/bin/bash
input=$1
if [[ $input == [\$]?[0-9][\,]?[0-9]*[\.]?[0-9]{2}?$ ]]
then
echo "Is a dollar amount"
else
echo "Is NOT a dollar amount"
fi
ドル記号、カンマ、ピリオドを(角かっこなしで)エスケープしてみましたが、それも機能しません。ドル記号を含む引数を一重引用符で囲みます(必須)。 ==を=~に変更しましたが、「ドル金額」と報告された可能性が多すぎます。ウェブ上で同様のものを検索することはほとんど不可能です。私は何が間違っていましたか?私が書いた内容が次の意味だと思いました。
- 先行ドル記号はオプションです。 - [$]?
- 少なくとも1桁の数字が必要です - [0-9]
- カンマはオプションです - [,]?
- 追加の数字はいくらでも受け入れられます - [0-9]*
- ピリオドはオプションです。 - [.]?
- 2つの追加番号があるかもしれませんが、これもオプションです。 - [0-9]{2}?
- 最後の2桁の後に何もない - $
答え1
=~
テストの代わりに演算子を使用したい場合がありますが、afterは==
使用できません。?
{2}
「数字がないか2桁」と言う正しい方法はです([0-9]{2})?
。
あなたが終わるのは
if [[ $input =~ ^\$?[0-9],?[0-9]*\.?([0-9]{2})?$ ]]; then ...; fi
ここでは、式を行の先頭に固定し、^
不要な角かっこも削除しました。
文字列のオプション部分が独立してオプションでない場合は、その部分を括弧で囲む必要があります。たとえば、次のようになります。
if [[ $input =~ ^\$?[0-9](,[0-9]+)?(\.[0-9]{2})?$ ]]; then ...; fi
カンマがある場合は、カンマの後に少なくとも1桁を、ドットがある場合は、ドットの後に少なくとも2桁が必要です。
答え2
@theyの上の投稿のおかげで答えを見つけました。
if [[ $input =~ ^\$?[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{2})?$ ]]
私は私が多くの間違いをしたことに気づきました。上記のスクリプトを「テスト」と呼び、いくつかのバリエーション(以下を参照)を試しましたが、すべて期待どおりに応答しました。
次のレポートは「ドル額です」
- ./test1
- ./test75
- ./test453
- ./test '$453'
- ./test1,234
- ./test1,234.89
- ./test1,234,657.89
次のレポートは、「ドルの金額ではない」を報告します。
- ./test1a234,657.89
- ./test 1,234.657.89 (2 つのピリオドに注意してください)
- ./test 1,234,657.9(セント桁がありません)