2017-09-14 7 views
0

Ich bin ziemlich neu zu schreiben bash und ich bin ein bisschen verwirrt über die Fehler/Problem mit meinem Code. Ich habe zwei Hauptprobleme. Im Fall P) würde ich gerne sehen, ob eine bestimmte Datei existiert. Wenn es existiert, würde ich gerne die balance mit der newbalance aktualisieren.Mit grep und sed eine Zeichenfolge ersetzen?

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 
    ;; 

wenn ich versuche, in einem payment so zu lesen, wie 100.00 ich einen Fehler erhalten:

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

Das Dateiformat seines Selbst ziemlich einfach ist und der Rest erscheint nur einmal.

Der Code funktionierte, wenn ich Echo umgeleitet, um die Datei zu ändern. Jetzt, da ich versucht habe, sed zu implementieren, hat der Code nicht mehr funktioniert, ich bin mir nicht sicher, was das verursacht. Ich habe versucht, find mit sed zu verwenden, aber das funktioniert auch nicht. Ich habe mir mehrere Stack-Überlauf-Fragen angeschaut, aber die Beispiele sind meinen ähnlich.

Dies ist eine der Dateien, die ich bin den Umgang mit

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

Sie haben Leerzeichen zwischen 'newbalance' und' = '. Sollte 'newbalance = $ (...' –

+0

'newbalance' ist eine eingetragene Marke. Sie sollten wahrscheinlich einen anderen Variablennamen verwenden, bevor Sie in Schwierigkeiten geraten. – hek2mgl

+0

Fügen Sie einen Beispielsatz von Zeilen aus Ihrer Datei hinzu, damit klar ist, um welche Art von Daten es sich handelt. – codeforester

Antwort

0

Sie bash verwenden können, um die Berechnung zu tun, keine Notwendigkeit für bc.

newbalance=$((payment + balance)) 

Der Befehl sed ist in Ordnung, Sie haben wahrscheinlich den Fehler, weil eine der Variablen Mist enthalten.

+0

Das scheint mir immer noch einen Fehler zu geben './menu.bash: Zeile 32: 130.00: Syntaxfehler: ungültiger arithmetischer Operator (Fehler Token ist" .00 ").' Ich hatte den Eindruck, dass ich BC für Floats @ brauchte yacc. –

+0

Ok ich dachte es sind ganze Zahlen. Dann führe ein "echo" s/$ balance/$ newbalance/"' aus, um zu überprüfen, was sed als Regex erhält. @below_avg_st – yacc

+0

Mit dem Echo bekomme ich '(standard_in) 2: Syntaxfehler s // sed: -e Ausdruck # 1, char 0: kein vorheriger regulärer Ausdruck' @yacc. –

0

Der wahrscheinlichste Grund, warum Sie diesen Fehler erhalten, ist, weil $balance leer ist. Zum Beispiel:

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

(Das Echo ist nur da, weil Eingang sed erwartet, egal was.)

So werden Sie verfolgen müssen, wo $balance wird ihren Wert immer und stellen Sie sicher, dass nicht hat versagt.

Aber da es noch geht störanfällig zu sein, würde ich einen etwas belastbarer Ansatz vorschlagen, mit AWK statt:

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

Dies setzt eine awk Variable newbalance auf den Wert der bash Variable mit dem Namen $newbalance und führt dann das Skript aus. Die FNR teilt mit, welche Zeile gelesen werden soll (in diesem Fall die zweite Zeile in der Datei), und $3=newbalance ändert den Wert des 3. Feldes in dieser Zeile auf den Wert, den wir vorher übergeben haben.

Die mv am Ende ist nur weil ältere Versionen von awk Dateien an Ort und Stelle nicht bearbeiten können. Siehe: awk save modifications in place

Seien Sie gewarnt, wenn Sie dieses Kaninchenloch hinuntergehen, könnten Sie am Ende das gesamte Skript in awk umschreiben, bevor Sie fertig sind. Zur Inspiration könnten Sie damit beginnen, die Arithmetik in awk selbst zu verschieben: