2017-09-14 12 views
0

私はかなりbashを書くことに新しいです、そして、私は自分のコードでエラー/問題を少し混乱させています。私には2つの大きな問題があります。場合はP)私は、特定のファイルが存在するかどうかを確認したいと思います。存在する場合はbalancenewbalanceに更新したいと考えています。文字列の下位にgrepとsedを使用していますか?

P) read -p "Enter email: " email 
    read -p "Enter payment amount: " payment 
    newbalance=$(echo $payment + $balance | bc) 
    if [ -f $email ]; then 
     sed -i "s/$balance/$newbalance/" $email 
     #also tried 
     #find . -type f -name "$email" -exec sed -i "s/${balance}{newbalance}/" {} \; 
    else 
     echo -e "Error: customer not found\n\n" 
    fi 
    balance=$newbalance 
    continue 
    ;; 

私はエラーが表示されるように100.00などpaymentに読み取ろう:

(standard_in) 2: syntax error 
sed: -e expression #1, char 0: no previous regular expression 

自己は非常に単純で、バランスは一度だけ表示されるファイル形式。

email name 
apt-XX rent balance duedate 

エコーをリダイレクトしてファイルを変更したときにコードが機能しました。今度はsedを実装しようとしましたが、コードが動作を停止しました。原因を特定できません。私はとsedを使ってみましたが、どちらもうまくいきません。私は複数のスタックオーバーフローの質問を見てきましたが、例は私のものと似ています。

これは、私はあなたが計算、BCの必要はありませんを行うためにはbashを使用することができます

[email protected] John Boat 
APT-5B 1100.00 100.00 2017-10-02 
+3

あなたは 'newbalance'と' = 'の間にスペースを入れます。 'newbalance = $(...' –

+0

'newbalance'は登録商標です。トラブルに終わる前に別の変数名を使うべきでしょう。 – hek2mgl

+0

ファイルの行のサンプルセットを含めて、扱っているデータの種類を明確にします。 – codeforester

答えて

0

を扱ってるファイルの1つです。

newbalance=$((payment + balance)) 

sedコマンドは問題ありません。変数の1つにクラップが含まれているため、おそらくエラーが発生しています。

+0

これはまだ私にエラー './menu.bash:32行目:130.00:構文エラー:無効な算術演算子(エラートークン" .00 ")を与えているようです。'私は浮動小数点@ yacc。 –

+0

私はすべての整数だと思った。次に、sedが正規表現として取得するものを調べるために 'echo $/balance/$ newbalance /' 'を実行します。 @below_avg_st – yacc

+0

エコーで私は '(standard_in)2を取得しています:構文エラーs // sed:-e式#1、char 0:前の正規表現' @yacc。 –

0

エラーが発生する最も一般的な理由は、$balanceが空であるためです。たとえば、次のように

$ echo 100.00 | sed 's//200.00/' 
sed: -e expression #1, char 0: no previous regular expression 

(sedのは、どんな入力を想定していないため、エコーがそこにある。)

ですから、$balanceがその値を取得し、それが失敗していないことを確認しているところを追跡する必要があります。

しかし、まだ故障しやすいことになるだろうから、私が代わりにAWKを使ってもう少し弾力的なアプローチをお勧めしたい:

awk -v newbalance="$newbalance" 'FNR==2 {$3=newbalance; print;}' "$email" > "$email.tmp" && mv "$email.tmp" "$email" 

これはbashの変数の値にnewbalanceと呼ばれるawkの変数を設定し、 $newbalanceを実行し、スクリプトを実行します。 FNRは、読み込む行(この場合はファイルの2行目)を通知し、$3=newbalanceは、その行の3番目のフィールドの値を、先に渡した値に変更します。

末尾のmvは、以前のバージョンのawkではファイルを編集できないからです。参照:awk save modifications in place

このウサギの穴を降りると、完了する前にawkでスクリプト全体を書き直すことになるかもしれないことに注意してください。インスピレーションのためには、算術演算をawk自体に移すことから始めることができます:

awk -v payment="$payment" 'FNR==2 {$3+=payment; print;}' "$email" > "$email.tmp" && mv "$email.tmp" "$email" 
関連する問題