2016-12-01 1 views
0

Ich habe ein Shell-Skript geschrieben, die einige Eigenschaften in einer Eigenschaftendatei ersetzt.Aber nach dem Ausführen des Skripts gibt es keine leere Zeile am Ende der Datei, die vor der Ersetzung vorhanden war.Leere Zeile fehlt nach der Verwendung von echo und sed

file=my_file.properties 
file_content=$(cat $file | sed "[email protected]=.*@[email protected]") #making a=b 
file_content=$(echo "${file_content}" | sed "[email protected]=.*@[email protected]") #making x=y 
echo "${file_content}" > $file 

my_file.properties ist so etwas wie

1)a=v 
2)b=c 
3)x=b 
4) 

Hinweis dort an den end.These Zahlen Leerzeile ist nur für die leere Zeile Command Substitution zu $(…)

+0

Fügen Sie einen Beispielinhalt der Datei 'my_file.properties' in der Frage hinzu. – GurV

Antwort

1

Von the Bash manual in Bezug Anzeigen (Hervorhebung meins):

Bash führt die Erweiterung durch Ausführen von Befehl in einer Subshell-Umgebung und Ersetzen der Befehlsersetzung durch die Standardausgabe des Befehls, mit allen nachfolgenden Zeilenenden gelöscht.

Also lieber die Ausgabe der Befehle in eine Variable als erfassen, können Sie sie in eine temporäre Datei erfassen sollte:

sed "[email protected]=.*@[email protected]" $file | sed "[email protected]=.*@[email protected]" > tmp.tmp 
mv tmp.tmp $file 

Oder wenn Sie GNU sed verwenden, können Sie es in einer Zeile tun :

sed -i -e "[email protected]=.*@[email protected]" -e "[email protected]=.*@[email protected]" $file 

die -i bedeutet die Datei an seinem Platz zu bearbeiten, so dass keine temporäre Datei benötigt wird.

+0

Außerdem gibt es fast nie einen Grund, 'cat' in einem Skript zu verwenden. –

+0

Warum, wie erhalten Sie den Inhalt der Datei –

+0

'cat filename | sed ... 'beinhaltet zwei Prozesse,' sed ... filename' macht dasselbe und benötigt nur einen. –

Verwandte Themen