2017-08-16 3 views
-1

Ich habe ein kleines Skript, das einige global Zeichenfolge Ersetzungen in verschiedenen Dateien tut. Dies sollte mit sed getan werden, so dass nur die betroffenen Zeilen geändert werden.sed funktioniert nicht wie erwartet mit Variablen im Skript

Zubereitung:

#!/bin/sh 
find="Mücke Motorsport" 
replace="Mücke Motorsport Racing Team" 
file="/Users/meyer/Dropbox/Dev/App Framework iOS/dev/myfile.txt" 

Dies ist meine problematische Zeile im Skript:

sed -i s/"$find"/"$replace"/g "$file" 

funktioniert nicht (sed: 1: "/Users/meyer/Dropb ...": invalid command code o). Nächster Versuch:

sed -i 's/'"$find"'/'"$replace"'/g' "$file" 

Funktioniert nicht (sed: 1: "/Users/meyer/Dropb ...": invalid command code o). Nächster Versuch:

sed -i "s/$find/$replace/g" "$file" 

Funktioniert nicht (sed: 1: "/Users/meyer/Dropb ...": invalid command code o). Nächster Versuch:

sed -i s/$find/$replace/g "$file" 

Funktioniert nicht (sed: 1: "Motorsport/Mücke": invalid command code M). Aufgrund dieser Fehlermeldung habe ich versucht, meine Variablen zu entkommen:

escaped_ find =$(printf '%s\n' "$find" | sed 's:[][\/.^$*]:\\&:g') 
escaped_ replace =$(printf '%s\n' "$replace" | sed 's:[\/&]:\\&:g;$!s/$/\\/') 

Aber Verwendung der Variablen ersetzen does't Arbeit ... Ich weiß nicht, wie diese Arbeit zu bekommen :(

+0

Welches Betriebssystem verwenden Sie? –

+0

Könnte das ein Codierungsproblem sein? Siehe diesen Beitrag: https://stackoverflow.com/questions/67410/why-does-sed-fail-with-international-characters-and-how-to-fix. 'sed -i" s/$ find/$ replace/g "" $ file "' funktioniert für mich. – piarston

+0

@YuriyZhigulskiy Ich benutze Mac OS (10.11 El Capitan) –

Antwort

2

Auf der OSX Version von sed, die Option -i erwartet eine Erweiterung Argument, damit Ihr Befehl tatsächlich als Erweiterung Argument analysiert wird und der Dateipfad wird als Befehlscode interpretiert.

Versuchen Hinzufügen des -e Argument explizit
sed -i'' -e 's/old/new/g' file

+0

Das ist es! Vielen Dank! –