GREP - Probleme mit Umlauten in Textdatei

Bozol

Bozol

Aktives Mitglied
Thread Starter
Dabei seit
16.07.2003
Beiträge
3.478
Reaktionspunkte
2.181
Hallo,

ich habe das Problem das Grep in einer Textdatei keine Umlaute erkennt. Ich rufe Grep z. B. innerhalb eines Applescripts so auf:
Code:
do shell script "grep -iE 'bär' '/Users/fred/Documents/Liste_Videos.txt' || exit 0"
In einem älteren Thread habe ich ein Beispiel von Pill gefunden welches zeigt das Grep auch mit Umlauten funktioniert.

Bei meiner Suche im WWW las ich viel von ev. falscher Kodierung von System oder Datei, aber lt. "locale" und "file" sind System und die Textdatei UTF-8. Trotzdem klappt es nicht.

Kann mir hier jemand einen Tip geben was da falsch läuft?

Danke, Fred.
 
also gerade mal hier probiert, funktioniert mit UTF-8 (mit/ohne BOM).
nicht bei UTF-16 oder latin…
sicher, dass die datei UTF-8 ist?
 
Ja.
Code:
/Users/fred/Documents/Liste_Videos.txt: UTF-8 Unicode text

Was mir gerade auffiel:
Code:
imac:~ fred$ locale
LANG="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_CTYPE="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_ALL=
Im letzten Eintrag ist nichts hinterlegt. Ist das normal?
 
Ich hab:
Code:
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"
und alles klappt problemlos. Habe auch verschiedene andere probiert, mit denen es ebenfalls geht. Auch bei einem leeren LC_ALL Eintrag (was idT so normal ist, wenn du es nicht selbst setzt), funktioniert es.

Kannst ja mal folgendes setzen:
Code:
export LC_ALL=en_US.UTF-8 
export LANG=en_US.UTF-8
Damit geht es bei mir auf jeden Fall. Sollte dann theoretisch auch mit de_DE gehen, was du ja anschließend setzen und ausprobieren kannst.


Sicher, dass du der Kodierung der Datei bzw. der Aussage von "file" trauen kannst? Versuch mal:
Code:
echo "bärrrrr" > out
grep -iE 'bär' out
 
@Kaito
Hat nichts gebracht. Ich ging jetzt auch davon aus das ich nach setzen der zwei Parameter kein Ab-/Anmelden oder so machen muss.
 
Im letzten Eintrag ist nichts hinterlegt. Ist das normal?

ja, ist normal.

hast mal in textwrangler o.ä. die kodierung gecheckt?

bedenke auch, dass do shell script eine andere shell nimmt (sh, aber ist auch die bash, könnte aber andere einstellungen haben).
 
Code:
imac:~ fred$ echo "bärrrrr" > out
imac:~ fred$ grep -iE 'bär' out
bärrrrr
Hm, das hat geklappt...

@oneOeight
hab mir gerade Textwrangler installiert, aber wo kann ich die Kodierung sehen?
 
Zuletzt bearbeitet:
Dann würde ich sagen es liegt an der Datei.
Was sagt file -I <deine Datei>?

ja, ist normal.

hast mal in textwrangler o.ä. die kodierung gecheckt?

bedenke auch, dass do shell script eine andere shell nimmt (sh, aber ist auch die bash, könnte aber andere einstellungen haben).

Wäre das das Problem, müsste imo aber
/bin/sh -c "grep -iE 'bär' out"
auch betroffen sein und das ist es bei mir nicht.
 
@Kaito
imac:~ fred$ file -i /Users/fred/Documents/Liste_Videos.txt
/Users/fred/Documents/Liste_Videos.txt: text/plain; charset=utf-8
 
Wenn man ein wenig sucht scheint "file" tatsächlich nicht so ultimativ verlässlich zu sein. Du könntest es mit "isutf8" aus den moreutils (z.B. via Homebrew) versuchen. Das prüft jedes vorhandene Zeichen der Datei.
Was ist eigentlich wenn du die Datei mal im Terminal mit "less" öffnest und dann suchst? Das geht via Eingabe von "/bär", gefolgt von Enter, wenn du in less bist.
 
Gehts so?

iconv -t utf8 Liste_Videos.txt | grep -iE 'bär'
 
Hallo Pill,
Code:
imac:~ fred$ iconv -t utf8 /Users/fred/Documents/Liste_Videos.txt  | grep -iE 'bär'
iconv: conversion to utf8 unsupported
iconv: try 'iconv -l' to get the list of supported encodings
imac:~ fred$ iconv -t utf-8 /Users/fred/Documents/Liste_Videos.txt | grep -iE 'bär'
imac:~ fred$
 
Haben wir verschiedene iconvs? Bei mir gehen beide Schreibweißen:
Code:
$ iconv -l | grep -i utf
UTF-8 UTF8
UTF-8-MAC UTF8-MAC
UTF-16
UTF-16BE
UTF-16LE
UTF-32
UTF-32BE
UTF-32LE
UNICODE-1-1-UTF-7 UTF-7 CSUNICODE11UTF7
 
@Kaito
Bei mir sieht es genauso aus. Wenn sich jemand mal an der Datei versuchen möchte: Klick. Es sind nur ein paar kb und ich habe ja nichts zu befürchten, es sind nur TV-Aufnahmen...
 
hmm, text wrangler findet bär auch nicht.

also wenn ich Eisbär so in der shell in eine text datei schreibe:
45697362C3A472

in deiner datei steht es als
4569736261CC8872

edit: wie kaito ausführt ist es combining diaeresis

fixen kannst es mit:
iconv -f UTF8-MAC Liste_Filme.txt|grep bär

oder direkt überführen
iconv -f UTF8-MAC -t UTF-8 Liste_Filme.txt > Liste_Filme_neu.txt
 
Zuletzt bearbeitet:
Ok das ist lustig. Du hast kein 'ä' in der Datei, sondern 'a' + '"', konkret das hier: http://www.fileformat.info/info/unicode/char/0308/index.htm
Wenn du danach suchst funktioniert es. :D

Code:
$ grep -i 'ba<0308>r' Liste_Filme.txt
Filme 2010 Bärenbrüder (2003).mp4
Filme 2010 Bärenbrüder 2 (2006).mp4
Filme 2014 Der große Bär (2011).mkv
Filme 2008 Der kleine Eisbär (2001).mp4
Filme 2013 Der kleine Eisbär - Besuch vom Südpol (2002).mkv
Filme 2013 Der kleine Eisbär - Nanouks Rettung (2009).mkv
Filme 2013 Der kleine Eisbär - Neue Abenteuer - neue Freunde (2002).mkv
Filme 2013 Der kleine Eisbär 2 - Die geheimnisvolle Insel (2005).mkv
Filme 2008 Käpt'n Blaubär (1999).mp4
Filme 2013 Kung Fu Panda 2 - Doppelt Bärenstark (2011).mkv
Filme 2011 Ayla Und Der Clan Des Bären (1985).m4v
Hinweis beim Nachmachen: meine ZSH stellt dieses Zeichen so in der Prompt dar (ich hatte es via copy&paste reinkopiert), aber eingeben kannst du es so nicht.
Falls du es kopieren willst, hier der eigentliche Suchausdruck, welcher im Prinzip aus 4 Zeichen besteht: bär

edit// Im Forum wird es noch korrekt dargestellt, aber die Zeichenfolge aus dem Forum in mein Terminal zu kopieren wandelt es wieder in ein korrektes "ä" um, ich weiß nicht wer hier schuld ist. Aus TextEdit kopieren funktioniert wunderbar.

Die Datei ist also tatsächlich valides UTF8 und grep hat absolut recht, da gibt es kein "bär", zumindest nicht mit diesem "ä". ;)
 
  • Gefällt mir
Reaktionen: Bozol
Zum Einen bin ich natürlich jetzt froh dass das Problem erkannt wurde, ich hatte schon an mir selbst gezweifelt. Aber: wie löse ich das Problem?
Die Textdatei wird so erstellt (siehe auch den alten Thread hier):
Code:
ls -URlT /Volumes/Filme | grep -iE 'mkv|mp4|m4v'|awk '{ print $9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25 }' | sed 's/^/Filme /' > '/Users/fred/Documents/Liste_Filme.txt'
Könnte da bereits hier was schiefgehen?
 
Ich gehe fest von aus deine Dateien, also die Namen der Dateien, haben bereits einen Namen der diese Zeichen tatsächlich verwendet. Also es ist kein Fehler in dem Sinne, die Zeichen sind dort und wurden immer korrekt weiterverarbeitet. Sie sehen halt aus wie ein ä, sind es, auf Zeichenebene, aber halt nicht.
Hast du das vielleicht mit einer USA International Tastatur getippt? Dort beispielsweise werden Umlaute wie ä mit " + ä erstellt und vermutlich dann auch so gespeichert. Das ist so auf einigen Tastaturlayouts geregelt und gar nicht so selten. Daher produziert man beispielsweise auch in LaTeX mittels "a ein ä.
Lösen kannst du es, indem du alle deine Dateien umbenennst, oder sie natürlich in der Datei selbst umbenennst:
Code:
$ sed 's/a<0308>/ä/g' Liste_Filme.txt | grep -iE "bär"
Filme 2010 Bärenbrüder (2003).mp4
Filme 2010 Bärenbrüder 2 (2006).mp4
Filme 2014 Der große Bär (2011).mkv
Filme 2008 Der kleine Eisbär (2001).mp4
Filme 2013 Der kleine Eisbär - Besuch vom Südpol (2002).mkv
Filme 2013 Der kleine Eisbär - Nanouks Rettung (2009).mkv
Filme 2013 Der kleine Eisbär - Neue Abenteuer - neue Freunde (2002).mkv
Filme 2013 Der kleine Eisbär 2 - Die geheimnisvolle Insel (2005).mkv
Filme 2008 Käpt'n Blaubär (1999).mp4
Filme 2013 Kung Fu Panda 2 - Doppelt Bärenstark (2011).mkv
Filme 2011 Ayla Und Der Clan Des Bären (1985).m4v
sed macht hier suchen&ersetzen des "a in ein richtiges ä. Nur "temporär" aber, die Originaldatei wird nicht angerührt.
Du wirst das gleiche Problem (wenn es durch deine Eingabe entstanden ist), aber wohl auch mit anderen, ähnlichen Buchstaben haben, wenn du Pech hast.
 
Aber: wie löse ich das Problem?

Könnte da bereits hier was schiefgehen?

problem löst du so:
Code:
ls -URl /Volumes/Filme | grep -iE 'mkv|mp4|m4v'|iconv -f UTF8-MAC -t UTF-8 > '/Users/fred/Documents/Liste\ Filme.txt'

liegt wohl an der speicherung der HFS namen…
 
  • Gefällt mir
Reaktionen: Bozol
Zurück
Oben Unten