Josef_: mehrere Wörter in mehreren txt-Dateien löschen

Moin an das Forum folgendes Anliegen liegt mir am Herzen: Ich versuche in mehreren txt-Dateien das zu extrahieren, was man als Fachwortschatz eines bestimmten Schulfaches bezeichnen könnte. Dazu nehme ich diverse Textdateien, aus denen ich das tilgen möchte, was man als Grundwortschatz bezeichnen könnte. Ich dachte sed wäre dazu ein gutes Werkzeug. Aber ich scheitere daran, mehr als einen Begriff ersetzen bzw. löschen zu lassen.

find 102-103.txt -type f -exec sed -i 's/zu ersetzende Wörter/ERSETZUNGSTEXT/g' {} ;

wobei der Teil /zu ersetzende Wörter/ die Crux sein dürfte. Wäre nett wenn jemand von euch mir einen Zaunpfahl rüberreichen könnte.

Gedacht ist das ganze als Vokabelwortschatz für eine durchgängige Sprachbildung von Geflüchteten in den einzelnen Fächern, wie Mathe, Physik, Chemie, Geschichte etc.

Liebe Grüße Josef

  1. man sed sagt:

    -f script-file,
    

    das kann viele Zeilen a la s/zu ersetzende Wörter/ERSETZUNGSTEXT/g enthalten.

    also

    s/foo/Platzhalter/g
    s/bar/Platzhalter/g
    

    diese Datei wiederum kann man aus einer Wortliste erzeugen:

    foo
    bar
    

    Das geht mit einem schnellen Skript:

    #!/bin/bash
    ### make-sed-skript.sh
    
    flag="true";
    
    while [ ${flag} = "true" ];
    do
       read zeile;
       zeile=$(echo -e "${zeile}" | tr -d "\n\r");
       zeile=$(echo -e "${zeile}" | sed "s/\//\/");
       if [ -n "${zeile}" ];
       then
          echo "s/${zeile}//g";
       else
          flag="false";
       fi
    done;
    

    Aufruf:

    cat woerter.txt | ./make-sed-skript.sh > delete.sed
    

    Ergebnis (delete.sed):

    s/foo//g
    s/bar//g
    

    jetzt also:

    sed -f delete.sed < deineTextdatei
    

    Beachte bitte, dass da auch ggf. auch noch eine Reihe von speziellen, in regulären Ausdrücken benutzte Zeichen "escaped" werden müssen ("*" > "*", "/" > "/" e.t.c.) Alternativ bringt Dich vielleicht auch man sed und das Beispiel

    echo "foo Bar baz" | sed -r "s/foo|bar/platzhalter/gi";
    

    weiter. Aber auch hier muss das s/foo\|bar/platzhalter/gi in einer Textdatei untergebracht werden, weil die Zeilenlänge ggf. beschränkt und die Wortliste zu lang ist. Beachte das "sed -r" für "erweiterte reguläre Ausdrücke". Sonst will sed das nicht können.

  2. Hallo Josef_,

    ich kenne sed nicht, aber ein erster Blick auf die GNU Doku sagt mir, dass sed eher ungeeignet für den Job ist. Meine Vermutung wäre, dass es mehr Wörter gibt, die zu löschen sind als solche, die fachspezifisch sind, d.h. du rufst SED zehntausende Male auf. Deine arme Festplatte...

    Ohne konkrete Tools unter unixoiden Systemen zu kennen, würde ich Dir eine mehrstufige Strategie vorschlagen wollen.

    1. Aufbrechen der Korpustexte von Zeilen in Wörter. Zu beachten ist die Frage, ob die Korpora getrennte Wörter ent- halten, die Du nach dem Aufbrechen zu einem Wort zusammensetzen musst.

    2. Entfernen von doppelten Wörtern. Das Ergebnis einer solchen Deduplizierung ist typischerweise eine sortierte Wortliste.

    3. Matchen dieser Wortliste gegen eine Liste irrelevanter Wörter und Entfernen dieser.

    4. Entfernen von flektierten Formen.

    5. Hinzufügen von Übersetzungen in diversen Sprachen

    Hast Du eine SQL Datenbank? In Schritt 2 und 3 wäre sie prima für diesen Job geeignet. Für Schritt 1 brauchst Du andere Tools, es sei denn, du bist fit in der jeweiligen Prozedursprache des verwendeten SQL Servers.

    Die Schritte 4 und 5 sind vermutlich großenteils Handarbeit.

    Rolf

    --
    sumpsi - posui - clusi
    1. Hallo Regina und Rolf vielen Dank für eure Antworten. Ich werde mein Bestes geben und berichten Gruß Josef