replace script von Sonderzeichen

B

berniebert

Grünschnabel
Hallo alle,
ich möchte in einigen Verzeichnissen auf einem Server Umlaute in allen Dateien ersetzen. Das habe ich mir mit einem Shell Script gedacht und mal ein Script ergoogelt:

for y in `ls *`;
do sed "s/BLÖK/BLOEK/g" $y > temp; mv temp $y;
done

Leider funktioniert das Script zwar mit Nicht-Sonderzeichen, aber sobald ein Sonderzeichen ersetzt werden soll, passiert gar nichts. Woran liegt das? Und was mache ich falsch?

Vielen Dank schonmal, Bb
 
Sieh dir mal die Darstellung an, ob deine Locale richtig gesetzt ist.
Sprich wie sieht das Ö aus, wenn du es mit cat Datei auf der Shell ausgibst.

Wolfgang
 
Wenn ich eine Datei in der SSH-Shell mit cat öffne werden die Umlaute korrekt angezeigt...
Auf meinem Server läuft Linux, auf meinem Client aber Mac OSX. Falls das wichtig ist?

:think:
 
Hi,

verstehst du das Skript das du oben gepostest hast ueberhaupt?
Wenn ich dich richtig verstanden habe, hast du dieses Skript hier genommen:

Code:
for y in `ls *`; do
	sed "s/BLÖK/BLOEK/g" $y > temp; 
	mv temp $y;
done

und dann erwartet dass er dir in allen Text Dateien in dem Verzeichnis die Umlaute umschreibt? Das kann ja auch nicht funktionieren. Dazu sag ich nur "man sed", bzw. such dir ein schoenes Tutorial zu sed, gibt's genug von.
Und "for y in `ls *`" wird wohl auch nicht fuer Dateien mit Leerzeichen funktionieren, das laesst sich vermutlich besser mit find in Verbindung mit exec loesen.

mfg,
bytepool
 
Zuletzt bearbeitet:
Sorry, da habe ich mich falsch ausgedrückt. Ich möchte mit dem Skript nicht *alle* Umlaute ersetzen, sondern nur die im Skript angegebene Zeichenkette. Z.B. soll das o.g. Skript das Wort "BLÖK" ersetzen durch "BLOEK".

Mein Verzeichnis enthält Dateien die nach dem Schema 1.xml, 2.xml, etc. benannt sind (also ohne Leerzeichen). In den Dateien steht Text, der auch Leerzeichen enthält.

Folgendes Skript funktioniert bei mir:

Code:
for y in `ls *`; do
	sed "s/ABC/DEF/g" $y > temp; 
	mv temp $y;
done

Alle Zeichenketten "ABC" werden durch "DEF" ersetzt. Dagegen werden bei diesem Skript die Zeichenketten "BLÖK" nicht ersetzt:

Code:
for y in `ls *`; do
	sed "s/BLÖK/BLOEK/g" $y > temp; 
	mv temp $y;
done

Wie gesagt, ich möchte nicht *alle* Umlaute ersetzen, sondern einige Zeichenketten, die unter Anderem Umlaute enthalten.
 
Hi,

verstehe, dann sollte dein Skript eigentlich funktionieren. Aber wahrscheinlich haengt das in der Tat auch vom Zeichensatz ab, wie Wolfgang das ja schon Vorschlug. Was sagt denn "locale"? Und in welchem Zeichensatz sind die xml Dateien kodiert? UTF-8?

Aber das ist auch ein Thema mit dem ich mich kaum auskenne. Doch wenn ich spekulieren muesste, wuerde ich sagen dass es zu dem Problem kommen kann, wenn die xml Dateien anders kodiert sind als sed das erwartet. Dann kann es theoretisch sein, dass ein "Ö" in einer Datei einen anderen Binaerwert hat, als ein "Ö" in sed, d.h. die beiden "Ö"s wuerden nicht korrekt gematcht. Aber wie gesagt, das ist Spekulation meinerseits, da ich mich noch nie eingehend mit dem Thema beschaeftigt hab.

mfg,
bytepool
 
Hi Wolfgang und bytepool,
ups, mir ist es gerade wie Schuppen von den Augen gefallen. Meine Konsole ist zwar UTF-8 und die Dateien auch, aber mein Shellskript habe ich im Texteditor auf dem Mac geschrieben, der als Default MacOS Latin codiert. Wenn ich die .sh Datei also explizit in UTF-8 speichere funktioniert es.

Danke für Eure Hinweise! Bb
 

Ähnliche Themen

Letzten Tag löschen

Array im Dateinamen wird nicht erkannt

xargs beschränkt? Script funktioniert nicht...

String aus Webseite extrahieren

rsync: Quelle größer als Ziel => "Archiv" aufteilen/splitten

Zurück
Oben