PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bestimmtes Zeichen in Datei ersetzen



oafish
12-08-2004, 07:55
Hallo,
ich möchte gerne in einer Textdatei ein bestimmtes Zeichen ersetzen.
Im moment mache ich das mit:
sed -e 's/norman/markus/g' /usr/local/files/namen.txt
Das Ergbnis auf der Konsole ist auch richtig, nur wird es nicht in der Datei gespeichert. Selbst wenn ich die Datei umlenke, erhalte ich eine leere Datei.

Was mache ich den falsch, kann mir das jemand genau erklären? Ich lerne gerade erst mit sed umzugehen :)

oafish

peschmae
12-08-2004, 08:38
Lösungen:


sed -e 's/norman/markus/g' /usr/local/files/namen.txt > namen.txt.tmp
mv namen.txt.tmp /usr/local/files/namen.txt


oder wenn dein Sed das kann auch:


sed -e 's/norman/markus/g' -i /usr/local/files/namen.txt


Das Problem ist dass Sed zeilenweise arbeitet - d.h. auch liest und schreibt. Wenn du sowas machst:


sed -e 's/norman/markus/g' /usr/local/files/namen.txt > /usr/local/files/namen.txt


kann das nicht gut kommen weil Sed zuerst Zeil1 liest, bearbeitet, dann schreibt und dabei die Datei _überschreibt_ - d.h. da wäre maximal eine Zeile drinn - die die Sed las bevor es zu schreiben begann.
Wieso dann jeweils keine drin ist weiss ich nicht - ist eigentlich auch egal, oder?

MfG Peschmä

oafish
12-08-2004, 10:23
Ah, wunderbar, bei mir geht der Parameter -i!
Danke für die schnelle Hilfe :)

oafish

oafish
12-08-2004, 10:42
Ähm, noch eine kurze Frage, wie funktioniert das mit einer Variablen?
Also anstatt Norman habe ich eine Variable var="Norman"



sed -e 's/$var/markus/g' -i /usr/local/files/namen.txt
oder
sed -e 's/'echo $var'/markus/g' -i /usr/local/files/namen.txt



beides geht nicht.

Gehts überhaupt???

oafish

peschmae
12-08-2004, 11:09
die ' verhindern dass Variablen ersetzt werden durch die Bash.

Entweder verwendest du " statt ' oder du lässt die ' ganz weg:


sed -e "s/$var/markus/g" -i /usr/local/files/namen.txt
sed -e s/$var/markus/g -i /usr/local/files/namen.txt


wobei das zweite dann Probleme macht wenn du irgendwelche Sonderzeichen dabei hast die die Bash interpretiert. Auch gehen würde das da:


sed -e 's/'$var'/markus/g' -i /usr/local/files/namen.txt

Weil da das $var für die Bash nicht innerhalb von den ' ist

MfG Peschmä

oafish
12-08-2004, 12:16
Hm funktioniert leider nicht! Allerdings auf einem älteren Rechner geht es prächtig. Denke es liegt an den unterschiedlichen Versionen. Werde erstmal updaten und anschließend weitersehen.

Danke für die Hilfe :)

oafish

peschmae
12-08-2004, 14:47
Was genau funktioniert nicht? Alle drei?
Verwendest du dort eventuell eine andere Shell als die Bash? (Für das Variableneinsetzen ist die Bash zuständig, nicht sed selber)

MfG Peschmä