2017-09-14 42 views
0

我對編寫bash相當陌生,我對代碼的錯誤/問題有點困惑。我有兩個主要問題。如果P)我想看看是否存在某個文件。如果存在,我想用newbalance更新balance使用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.00payment我收到一個錯誤:

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

文件格式自身是非常簡單和平衡只出現一次。

email name 
apt-XX rent balance duedate 

當我重定向echo來修改文件時,代碼工作。現在,我試圖執行sed代碼已停止工作,我不確定是什麼導致它。我試過使用findsed,但那也行不通。我看過多個堆棧溢出問題,但這些例子與我的類似。

這是我處理

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

'newbalance'和'='之間有空格。應該是'newbalance = $(...' –

+0

'newbalance'是一個註冊商標。在結束麻煩之前,您應該使用不同的變量名稱。 – hek2mgl

+0

在你的文件中包含一組樣本行,以便清楚你處理的數據類型。 – codeforester

回答

0

您可以使用bash做計算,不需要BC的文件之一。

newbalance=$((payment + balance)) 

該sed命令是好的,你可能得到了錯誤,因爲其中一個變量包含廢話。

+0

這似乎還給我一個錯誤'./menu.bash:line 32:130.00:syntax error:invalid arithmetic operator(error token is「.00」)。'我的印象是我需要bc來獲得浮動@ YACC。 –

+0

好吧,我認爲這都是整數。然後做一個'echo's/$ balance/$ newbalance /「'來檢查sed是否是正則表達式。 @below_avg_st – yacc

+0

隨着回聲我得到'(standard_in)2:語法錯誤s // sed:-e表達式#1,字符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" 

這臺名爲newbalance一個awk變量bash的變量的值$newbalance然後運行該腳本。 FNR告訴它要讀取哪一行(在本例中是文件中的第二行),並且$3=newbalance將該行中第三個字段的值更改爲我們先前傳入的值。

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"