ubuntuusers.de

grep findet keine Umlaute oder ß

Status: Gelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

HaCeMei Team-Icon

Anmeldungsdatum:
2. August 2010

Beiträge: 2265

Mit grep kann ich keine Sonderzeichen bzw. "ß" suchen/ finden.

Ich habe nach der Seite Spracheinstellungen überprüft, ob die Zeichencodierung im Terminal stimmt. Das sieht dann so aus.

< /etc/default/console-setup grep CODESET
CODESET="Lat15"

Wie kann ich grep entsprechend bedienen/ konfigurieren? Es muss gehen, denn im midnight commander kann ich unter "Datei finden" den Inhalt von Dateien durchsuchen. Wenn ich dort "All charsets" anwähle wird grep gestartet und findet auch Umlaute.

Benno-007

Anmeldungsdatum:
28. August 2007

Beiträge: 29240

Wohnort: Germany

Poste doch mal so eine Ausgabe und Eingabe, wo man mehr draus erkennen kann.

HaCeMei Team-Icon

(Themenstarter)

Anmeldungsdatum:
2. August 2010

Beiträge: 2265

In einem Verzeichnis mit doc-, odt-, pdf-Dateien gebe ich ein

grep erdem *

Grep findet alle Dateien, die diese Zeichenfolge enthalten. Tatsächlich enthalten die gefundenen Dateien das Wort "außerdem"

Gebe ich aber ein

grep außerdem *

, wird nichts gefunden.

Bei txt-, csv- und html-Dateien tritt das Problem nicht auf.

themroc

Avatar von themroc

Anmeldungsdatum:
5. November 2006

Beiträge: 1551

Wohnort: JWD bei Berlin

Naja, dann schau doch mal in deine doc-, odt-, pdf-Dateien mit einem Texteditor rein.

Ich behaupte, du wirst da außerdem nicht finden.

Dann kann grep es natürlich auch nicht finden.

In doc-, odt-, pdf-Dateien wirds du außer Hyroglyphen nichts erkennen. Erst docx-Dateien haben den Text in nicht binärer Form mit drin.

HaCeMei Team-Icon

(Themenstarter)

Anmeldungsdatum:
2. August 2010

Beiträge: 2265

Ja, so habe ich bisher auch gedacht und mich einfach damit zufrieden gegeben. Jedoch "grept" der midnight commander meine Verzeichnisse durch - und wird fündig wenn "search AllCharsets" angewählt ist. Ich suche nun eine Möglichkeit, diese Funktion direkt in grep aufzurufen.

themroc

Avatar von themroc

Anmeldungsdatum:
5. November 2006

Beiträge: 1551

Wohnort: JWD bei Berlin

Im Prinzip müsste es mit dem Bash-Skript aus Skripte/Zeichensatzkonvertierung gehen

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/bin/bash
#
# encoding-finder.sh
# (C) GPLv3, Stefan Wagner 2007
#
# In einer Datei einen bekannten (Teil-)String (z.B.: Begrüßung) suchen,
# indem alle Encodings ausprobiert werden.
#
[[ $# -ne 2 ]] && echo "Usage: encoding-finder.sh FILE PATTERN_WITH_UMLAUT_FOR_SURE_IN_FILE" && exit
FILE=$1
PATTERN=$2
for enc in $( iconv -l | sed 's/..$//')
do
        iconv -f $enc -t UTF-8 $FILE  2>/dev/null | grep $PATTERN && echo $enc
done

Wobei dich nicht die Kodierung, sondern der File interessiert.

Du müsstest es also irgendwie umbauen.

HaCeMei Team-Icon

(Themenstarter)

Anmeldungsdatum:
2. August 2010

Beiträge: 2265

Also, da komme ich jetzt deutlich an meine Grenzen. Ich muss erst mal schauen, wie man ein Skript richtig startet. Danke für den Hinweis.

themroc

Avatar von themroc

Anmeldungsdatum:
5. November 2006

Beiträge: 1551

Wohnort: JWD bei Berlin

Ich habe ein bisschen rumgeschrieben, aber es funktioniert noch nicht. Leider habe ich gerade auch nicht so viel Zeit.

Im Prinzip kannst du den Inhalt in eine neue Datei packen und dann ausführbar machen und rumprobieren.

themroc

Avatar von themroc

Anmeldungsdatum:
5. November 2006

Beiträge: 1551

Wohnort: JWD bei Berlin

Ach so, starten kannst du es in der Konsole dann einfach mit

./skriptname

oder

/absoluterPfad/skriptname

HaCeMei Team-Icon

(Themenstarter)

Anmeldungsdatum:
2. August 2010

Beiträge: 2265

Also, das Skript führt jetzt noch nicht weiter. Ich habe in FILE eine Testdatei eingetragen und unter PATTERN "außerdem". Unabhängig davon, ob die Datei tatsächlich "außerdem" enthält oder nicht, kommt folgende Ausgabe:

Usage: encoding-finder.sh FILE PATTERN_WITH_UMLAUT_FOR_SURE_IN_FILE

HaCeMei Team-Icon

(Themenstarter)

Anmeldungsdatum:
2. August 2010

Beiträge: 2265

Die Lösung für odt-Dateien findet sich hier (Skript von Benjamin Zimmer):

http://www.zeroathome.de/wordpress/viele-openoffice-dokumente-nach-begriff-durchsuchen/

Abgewandelt funktioniert das Skript auch für doc-Dateien, allerdings muss zunächst catdoc installiert sein.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/bin/bash
 
if [ $# -ne 2 ]; then
    echo "Benutzung: searchdoc pfad ausdruck"
    exit 1
fi
 
    find $1 -name "*.doc" | while read file
    do
        catdoc "$file" | grep -qli "$2"
    if [ $? -eq 0 ]; then
        echo "Suchbegriff gefunden in " $file
    fi
done


Wenn man das unter searchdoc abspeichert, kann man es unter

./searchdoc Pfad/zu/Dateien Gesuchter_Ausdruck

aufrufen.

themroc

Avatar von themroc

Anmeldungsdatum:
5. November 2006

Beiträge: 1551

Wohnort: JWD bei Berlin

HaCeMei schrieb:

Also, das Skript führt jetzt noch nicht weiter. Ich habe in FILE eine Testdatei eingetragen und unter PATTERN "außerdem". Unabhängig davon, ob die Datei tatsächlich "außerdem" enthält oder nicht, kommt folgende Ausgabe:

Usage: encoding-finder.sh FILE PATTERN_WITH_UMLAUT_FOR_SURE_IN_FILE

Die Usage Ausgabe kommt dann, wenn das Skript mit zu wenig oder zu viel Parametern aufgerufen wurde.

Ansonsten verstehe ich nicht, warum der Moderator diesen Beitrag nicht endlich in Shell und Programmieren verschiebt, den dort gehört er ja hin. Dort findet sich eventuell eher jemand der sich schonmal mit dem Problem befasst hat.

HaCeMei Team-Icon

(Themenstarter)

Anmeldungsdatum:
2. August 2010

Beiträge: 2265

themroc schrieb:

Ansonsten verstehe ich nicht, warum der Moderator diesen Beitrag nicht endlich in Shell und Programmieren verschiebt, den dort gehört er ja hin. Dort findet sich eventuell eher jemand der sich schonmal mit dem Problem befasst hat.

Ja, scheint mir auch so - habe ich aber noch nicht erkannt, als ich den Thread gestartet habe. Mit dem Skript unter Beitrag 13 ist die Sache aber für mich eigentlich erledigt. Vielen Dank für alle Antworten!

HaCeMei Team-Icon

(Themenstarter)

Anmeldungsdatum:
2. August 2010

Beiträge: 2265

Die richtige Lösung habe ich hier gefunden. Sie lautet

LC_ALL=de_DE.utf8 grep SUCHWORT *.*

Gruß, HaCeMei

Benno-007

Anmeldungsdatum:
28. August 2007

Beiträge: 29240

Wohnort: Germany

Bei mir funktioniert es ohne Probleme ohne Anpassungen:

$ echo ä | grep ä
ä
$ echo ß | grep ß
ß
$ 

locale ist Standard:

$ locale
LANG=de_DE.UTF-8
LANGUAGE=de_DE:en
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER="de_DE.UTF-8"
LC_NAME="de_DE.UTF-8"
LC_ADDRESS="de_DE.UTF-8"
LC_TELEPHONE="de_DE.UTF-8"
LC_MEASUREMENT="de_DE.UTF-8"
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=

Ebenfalls Ubuntu 10.04.

Antworten |