sed: Umlaute in Dateien ersetzen

sheep

sheep

Aktives Mitglied
Thread Starter
Dabei seit
21.03.2005
Beiträge
1.255
Reaktionspunkte
25
Hallo

Ich möchte gerne mit sed (d.h. eigentlich ist es egal womit, aber dieser Befehl ist der einzige, den ich dafür gefunden habe) in vielen Dateien die Umlaute durch Unicode ersetzen. Nun habe ich das zunächst so probiert:

find . -name *.html -exec sed -f umlaute.txt {} \;

und in umlaute.txt steht:

s/ä/\ä/g
s/ü/\ü/g
s/ö/\ö/g
s/Ä/\Ä/g
s/Ü/\Ü/g
s/Ö/\Ö/g

Soweit funktioniert alles bestens. Nun soll jedoch der Inhalt der jeweiligen Datei sofort mit dem umlautefreien Inhalt ersetzt werden (hier wird einfach der neue Inhalt auf der Konsole ausgegeben) - und da ist das Problem: die Option "-i", die man normalerweise verwenden kann, funktioniert offenbar zusammen mit "-f" nicht. Auch kann ich nicht in umlaute.txt eine weitere Zeile "w {}" anhängen, da {} als Dateiname und nicht als Platzhalter interpretiert wird.

Ich habe es dann mit einer for-Schleife versucht:

for file in *.html
do
sed -f umlaute $file > tmp.$file
[ -s tmp.$file ] && mv tmp.$file $file
done

aber das ist leider nicht rekursiv, d.h. all die Unterverzeichnisse, in denen die vielen Dateien liegen, werden nicht durchgegangen.


Kann mir jemand einen Tipp geben? So schwierig kann es doch nicht sein, aber ich komm' echt nicht weiter...
 
Du könntest ja noch eine Prüfung einbauen, welche Prüft ob es sich um eine Datei oder einen ORdner handelt. Wenn es ein Ordner ist, entsprechend rekursive das Script dafür öffnen.

Edit: Paelmchen sein Lösung eliminiert das Problem der recursiven Ordner schon mit dem passenden find aufruf :) ... hab wieder zu kompliziert gedacht
 
Zuletzt bearbeitet:
for file in `find . -name *.html`
do
...
done

try this ...
 
guck dir chgrep an...
damit hab ich mal in einem mysql dump die ganzen latin und utf-16 umlaute in utf-8 umlaute umgebaut...
 
Als Skript speichern:
Code:
find . -name "*.html" | perl -pi -e "s/ä/\ä/g"
find . -name "*.html" | perl -pi -e "s/ü/\ü/g"
find . -name "*.html" | perl -pi -e "s/ö/\ö/g"
find . -name "*.html" | perl -pi -e "s/Ä/\Ä/g"
find . -name "*.html" | perl -pi -e "s/Ü/\Ü/g"
find . -name "*.html" | perl -pi -e "s/Ö/\Ö/g"
Hab's nicht getestet, da gerade kein Mac zur Hand.
Perl muss natürlich installiert sein.
 
Das ging ja schnell, vielen Dank schon mal :).

Ich werde mir eure Vorschläge jetzt einen nach dem anderen genauer ansehen und hoffe, dass irgend etwas davon funktionieren wird :).
 
Hmm, das will leider alles nicht so recht klappen :(. Meine Dateien scheinen entweder eine komische Zeichenkonvertierung zu haben, oder es liegt an meinem AJAX, mit dem ich die Dateien in eine Website einbinde.

Ich gebe das besser auf, bevor ich noch mehr Zeit verbrate und sehe mich nach einer anderen Möglichkeit um.

Danke jedenfalls :).
 
hat jetzt zwar nix mit unix zu tun ...
ich verwende für solche aufgaben textwrangler - hat ein mächtiges, gut konfigurierbares *multi file search and replace* - lässt sich auch in diversen scriptsprachen scripten falls nötig.
 
Wesentlich einfacher wäre es vermutlich gewesen, den Webserver so zu konfigurieren, dass er den Clients das richtige Charset mitteilt :D.
 
Zuletzt bearbeitet:
maceis schrieb:
Wesentlich einfacher wäre es vermutlich gewesen, den Webserver so zu konfigurieren, dass er den Clients das richtige Charset mitteilt :D.
Das ist schon richtig, aber das Ganze muss eben direkt von einer DVD laufen können und da sieht's mit Webservern etwas düster aus ;) (es gibt zwar solche Dinger, aber die ich bin jetzt gefunden habe, sind entweder sauteuer und / oder laufen nur auf Windows).
 
Paelmchen schrieb:
for file in `find . -name *.html`
do
...
done

Hat zwar mit dem Thema nichts zu tun, allerdings fliegen Dir solche Konstrukte auf jedem System, das Leerzeichen in Filenamen enthält (OS X ist ja ein typischer Vertreter), um die Ohren.

Korrekt wäre eher

Code:
IFS=$'\0'
find $WHERE ... -print0 | xargs -0 -n 1 sh -c '
process "$1"
' "$0"
 
Zurück
Oben Unten